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


87

我最近在.cmd文件中包含了与此类似的行:

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

最初,我只使用%f,并且在命令行上运行时可以正常工作,而在文件中运行时则无法正常工作。当我切换到%% f时,它在文件中起作用。只是想知道有什么区别。

Answers:


136

(有关更多详细信息的说明,请参见已归档的Microsoft KB文章。)

要知道的三件事:

  1. 百分号在批处理文件用来表示命令行参数:%1%2,...
  2. 介于两个百分号之间的任何字符将被解释为变量:

    echo %myvar%

  3. 两个百分号之间(在批处理文件中)之间没有任何东西,将被视为命令中的单个百分号(不是批处理文件):%%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

21
对于为什么直接在命令提示符下而不是从批处理文件执行时,为什么在FOR循环中仅使用一个百分号有什么解释?我了解DOS的传统,但是我们现在可以从命令行使用变量。
阿列克·梅夫

6
另外,确保变量是单个字符。
jiggunjer

1
如果我要发出包含%的命令怎么办,例如:对于(f git log -1 --pretty = format:“ %% H”')中的/ f %% i,请设置GIT_COMMIT = %% i
Wakan Tanka

15

在DOS中,您不能在命令行上使用环境变量,而只能在批处理文件中使用环境变量,在批处理文件中,它们使用%符号作为分隔符。如果要%在批处理文件中(例如在echo语句中)使用文字符号,则需要将其加倍。

这会延续到Windows NT,允许在命令行上使用环境变量,但是为了向后兼容,您仍然需要将%.cmd文件中的符号加倍。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.