cmd文件中%和%%有什么区别?
我最近在.cmd文件中包含了一个类似于下面的代码行:
for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"
最初我只使用%f,并且在命令行上运行时可以正常工作,但在运行文件时不会运行。 当我切换到%% f时,它在文件中工作。 只是想知道有什么不同。
(更详细的解释可以在这个微软kbfind。)
三件事要知道:
- 百分号用于batch file中以表示命令行参数:
%1
,%2
,… -
两个百分号之间的任何字符都被解释为一个variables:
echo %myvar%
- 两个百分号之间没有任何内容(在一个batch file中)被视为一个命令(不是batch file)中的单个百分号:
%%f
为什么?
例如,如果我们执行你的(简化的)命令行
FOR /f %f in ('dir /b .') DO somecommand %f
在batch file中, 规则2将尝试解释
%f in ('dir /b .') DO somecommand %
作为一个variables。 为了防止这种情况发生,你必须应用规则3并且用%
来转义%
:
FOR /f %%f in ('dir /b .') DO somecommand %%f
在DOS中,不能在命令行上使用环境variables,只能在batch file中使用%
符号作为分隔符。 如果您想在batch file中使用字面%
符号,例如在echo
语句中,则需要将其加倍。
这延续到允许命令行上的环境variables的Windows NT,但是为了向后兼容,您仍然需要将.cmd文件中的%
符号加倍。