%CMDCMDLINE% 特殊变量神奇地改变了,虽然没有分配

%CMDCMDLINE% special var magically altered, although there's no assignment

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

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

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

@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_ __

如您所见,虽然没有赋值,但变量已更改。对于具有相同值的其他环境变量不会发生这种情况。

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

它很有用,因为它很有可能检查解析器的工作原理。
就像这个问题一样,如果解析器在 REM 或标签之后扩展变量?
顺便提一句。它也以与延迟扩展相同的方式工作

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

echo %CMDCMDLINE%

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