我最近在 .cmd 文件中包含了与此类似的一行:
for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"
最初我只使用了 %f,在命令行上运行它可以正常工作,但在通过文件运行时就不行了。当我切换到 %%f 时,它在文件中工作。只是想知道有什么区别。
我最近在 .cmd 文件中包含了与此类似的一行:
for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"
最初我只使用了 %f,在命令行上运行它可以正常工作,但在通过文件运行时就不行了。当我切换到 %%f 时,它在文件中工作。只是想知道有什么区别。
(可以在存档的 Microsoft 知识库文章中找到更详细的说明。)
需要知道的三件事:
%1
, %2
, ...两个百分号之间的任何字符都被解释为一个变量:
echo %myvar%
%%f
为什么?
例如,如果我们执行您的(简化的)命令行
FOR /f %f in ('dir /b .') DO somecommand %f
在批处理文件中,规则 2将尝试解释
%f in ('dir /b .') DO somecommand %
作为变量。为了防止这种情况,您必须应用规则 3%
并用第二个转义%
:
FOR /f %%f in ('dir /b .') DO somecommand %%f
在 DOS 中,您不能在命令行中使用环境变量,只能在批处理文件中使用%
符号作为分隔符。如果您想%
在批处理文件中(例如在echo
语句中)使用文字符号,则需要将其加倍。
这延续到允许在命令行上使用环境变量的 Windows NT,但是为了向后兼容,您仍然需要%
在 .cmd 文件中加倍您的符号。