在我的系统上应用这个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