尽管没有分配,但%CMDCMDLINE%特殊var进行了魔术更改

时间:2018-06-22 21:00:46

标签: batch-file windows-7 command-prompt

在我的系统上应用此SO answer后,我注意到单击.bat文件现在会导致:

"/c" is not recognized as an internal or external command

为了修复它,我尝试使用%CMDCMDLINE%替换IF表达式中Environment variable substitution中的引号。然后我注意到了一些奇怪的事情。这是我的测试批处理文件:

@echo off
echo _%CMDCMDLINE%_
echo _%CMDCMDLINE:"=_%_
echo _%CMDCMDLINE%_
pause

这是它的输出:

_C:\Windows\system32\cmd.exe /c ""C:\cygwin\opt\openconnect64\rek.bat" "_
_C:\Windows\system32\cmd.exe /c __C:\cygwin\opt\openconnect64\rek.bat_ __
_C:\Windows\system32\cmd.exe /c __C:\cygwin\opt\openconnect64\rek.bat_ __

如您所见,尽管没有分配,但变量已更改。具有相同值的其他环境变量不会发生这种情况。

1 个答案:

答案 0 :(得分:1)

您找到了well known cmdcmdline effect
它是唯一显示此非常有用的行为的变量。

这很有用,因为很有可能检查解析器的工作方式。
像问题一样,解析器是否在REM或标签后扩展变量?
顺便说一句。延迟扩展的工作方式也相同。

@echo off
echo %CMDCMDLINE%
REM %CMDCMDLINE:C:=1#%
: %CMDCMDLINE:"=X%

echo %CMDCMDLINE%

应避免使cmdcmdline变量的长度大于初始长度,因为这可能会使cmd.exe崩溃