Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?

指南:

每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包

澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。

(请参见:Windows批处理文件:.bat vs .cmd?)


当前回答

获取当前的日、月和年(独立于locale):

for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date

:set_date
if ("%1:~0,1%" gtr "9") shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof

:end_set_date

echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%

其他回答

不知道这在批处理文件中有多有用,但在命令提示符中使用它是一个非常方便的命令:

C:\some_directory> start .

这将在“some_directory”文件夹中打开Windows资源管理器。

我发现这非常节省时间。

创建并开始编辑一个新文件

copy con new.txt
This is the contents of my file
^Z

Ctrl+Z发送ASCII EOF字符。这就像bash中的heredocs:

cat <<EOF > new.txt
This is the contents of my file
EOF

通过使用CALL, EXIT /B, SETLOCAL和ENDLOCAL可以实现带有局部变量的子例程。

例子:

@echo off

set x=xxxxx
call :sub 10
echo %x%
exit /b

:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b

这将打印

11
xxxxx

尽管:sub修改了x。

SHIFT

这是一种在命令行上迭代传递到脚本(或子例程)的可变数量的参数的方法。在最简单的用法中,它将%2转换为%1,将%3转换为%2,依此类推。(你也可以传递一个参数给SHIFT来跳过多个参数。)这使得命令具有“破坏性”(即%1永远消失),但它允许您避免硬编码支持的参数的最大数量。

下面是一个简短的例子,一次处理一个命令行参数:

:ParseArgs

if "%1"=="" (
    goto :DoneParsingArgs
)

rem ... do something with %1 ...

shift

goto :ParseArgs


:DoneParsingArgs

rem ...

具有数值变量的循环的正确格式是

for /l %%i in (startNumber, counter, endNumber) do echo %%i

更多详情> http://www.ss64.com/nt/for.html