Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file cmd文件中的%和%%之间有什么区别?_Batch File_Cmd - Fatal编程技术网

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

Batch file cmd文件中的%和%%之间有什么区别?,batch-file,cmd,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时,它在文件中起作用。只是想知道区别是什么。在DOS中,您不能在命令行中使用环境变量,只能在批处理文件中使用,%符号作为分隔符。如果希望在批

我最近在.cmd文件中包含了一行类似的内容:

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

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

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

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

(更多详细说明可在中找到。)

要知道三件事:

  • 批处理文件中使用百分号表示命令行参数:
    %1
    %2
  • 中间有任何字符的百分之二符号被解释为变量:

    echo%myvar%

  • 在批处理文件中,中间没有任何内容的两个百分号被视为命令(而不是批处理文件)中的单个百分号:
    %%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
    

    当直接从命令提示符而不是从批处理文件执行时,为什么我可以在for循环中只使用1%的符号?我知道DOS的传统,但我们现在可以使用命令行中的变量。另外,请确保变量是单个字符。如果我要发出包含%的命令,例如:for/f%%I in('git log-1--pretty=format:'%H'),请将git_COMMIT=%%iIn设置为除for循环中的%g之外,还允许%1。%%在脚本中需要,以避免歧义。“在命令行(而不是批处理脚本)上工作时,不可能存在任何批处理文件参数%1、%2等,因此不遵循上述逻辑,因此命令行上的参数只需要一个%。”请参阅。