cmd文件中%和%%有什么区别?

我最近在.cmd文件中包含了一个类似于下面的代码行:

for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f" 

最初我只使用%f,并且在命令行上运行时可以正常工作,但在运行文件时不会运行。 当我切换到%% f时,它在文件中工作。 只是想知道有什么不同。

(更详细的解释可以在这个微软kbfind。)

三件事要知道:

  1. 百分号用于batch file中以表示命令行参数: %1%2 ,…
  2. 两个百分号之间的任何字符都被解释为一个variables:

    echo %myvar%

  3. 两个百分号之间没有任何内容(在一个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文件中的%符号加倍。