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



在我的系统上应用这个SO答案后,我注意到现在单击.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:Windowssystem32cmd.exe /c ""C:cygwinoptopenconnect64rek.bat" "_
_C:Windowssystem32cmd.exe /c __C:cygwinoptopenconnect64rek.bat_ __
_C:Windowssystem32cmd.exe /c __C:cygwinoptopenconnect64rek.bat_ __

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

你发现了众所周知的cmdcmdline效应。
这是显示这种非常有用行为的唯一变量。

这很有用,因为它是检查解析器如何工作的好机会。
就像这个问题一样,如果解析器在REM或标签之后扩展变量?
顺便说一句。它的工作方式与延迟扩展相同

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

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

相关内容

最新更新