我已经注意到在一个Windowsbatch file,即使你REM了%〜你得到的错误
For valid formats type CALL /? or FOR /? The syntax of the command is incorrect.
为什么没有被忽略的评论行?
@ ECHO OFF REM Blah blah blah REM %~ this will cause an error REM %%~ Double the fun, no error
REM是ECHO的命令。 在命令提示符窗口中运行rem /?
得到这个命令的帮助。
Windows命令解释程序首先像批处理文件中的所有其他行那样解析此命令行,但以冒号开头的那些行被解释为标签行而不是命令行。
因此,在执行REM之前,单个%
被解释为环境变量或批处理文件参数引用的开始。 单个百分号被删除,因为在这个命令行上没有百分号。
%~
在命令行解析中被解释为无效的批处理文件参数引用。 对于Windows命令解释器来说,命令REM不会评估该行的其余部分并不重要。 首先命令行是独立于命令进行解析的,然后命令由cmd.exe
执行,无论命令是什么。
删除第一行@ ECHO OFF
,可以看到每个命令行是如何在被Windows命令解释器解析后执行的。 以冒号开头的行不会被解释为标签行而不是命令行。
有关批处理脚本解析的详细信息,请参阅Windows命令解释器(CMD.EXE)如何解析脚本?
例:
REM User name: %USERNAME% REM User profile directory: %USERPROFILE% REM Application data directory: %APPDATA% REM Batch arguments: %0 %* PAUSE
那些REM命令行中的环境变量引用和批处理文件参数引用被替换为运行此批处理文件时的环境变量和批处理文件参数的值,而@ECHO OFF
在顶部@ECHO OFF
。
(最初)发布的代码不会导致错误。 但是这将会:
REM %~ this will cause an error
原因是参数扩展的优先级高于注释,cmd.exe会首先尝试扩展和取消这里未给出的参数%~