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

时间:2013-01-24 19:57:47

标签: batch-file cmd

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

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

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

2 个答案:

答案 0 :(得分:111)

(详情请参阅an archived Microsoft KB article。)

要了解三件事:

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

    echo %myvar%

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

  4. 为什么?

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

    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
    

答案 1 :(得分:12)

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

这转移到Windows NT,允许在命令行上使用环境变量,但为了向后兼容,您仍需要将。{1}}符号加倍.cmd文件。