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

Tyl*_*ler 69 cmd batch-file

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

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

最初我只使用%f,它在命令行上运行时可以正常工作,但在运行文件时却不行.当我切换到%% f时,它在文件中工作.只是想知道区别是什么.

mar*_*pet 114

(有关更多详细信息的说明,请参阅存档的Microsoft知识库文章.)

要知道的三件事:

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

    echo %myvar%

  3. 两个百分号之间没有任何内容(在批处理文件中)被视为命令中的单个百分号(不是批处理文件):%%f

为什么?

例如,如果我们执行您的(简化)命令行

FOR /f %f in ('dir /b .') DO somecommand %f
Run Code Online (Sandbox Code Playgroud)

在批处理文件中,规则2会尝试解释

%f in ('dir /b .') DO somecommand %
Run Code Online (Sandbox Code Playgroud)

作为变量.为了防止这种情况,您必须应用规则3%使用第二个转义%:

FOR /f %%f in ('dir /b .') DO somecommand %%f
Run Code Online (Sandbox Code Playgroud)

  • 有没有解释为什么我可以直接从命令提示符执行而不是从批处理文件执行FOR循环中只使用一个百分号?我知道DOS遗产,但我们现在可以**从命令行使用变量. (20认同)
  • 另外,确保变量是单个字符. (5认同)

Nei*_*eil 12

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

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