%CMDCMDLINE% 特殊变量被神奇地改变了,虽然没有赋值
Posted
技术标签:
【中文标题】%CMDCMDLINE% 特殊变量被神奇地改变了,虽然没有赋值【英文标题】:%CMDCMDLINE% special var magically altered, although there's no assignment 【发布时间】:2018-12-02 09:07:21 【问题描述】:在我的系统上应用此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_ __
如您所见,虽然没有赋值,但变量已更改。其他具有相同值的环境变量不会发生这种情况。
【问题讨论】:
而不是IF /I x"%COMSPEC%"==x%CMDCMDLINE% (cd /D c:\)
更好地使用IF /I "%COMSPEC%"=="%CMDCMDLINE:"= %" (cd /D c:\)
好的,我已经纠正了,不知道 cmd.exe 将自动变量存储在哪里,看起来这是一个指针问题。在打开的窗口中连续运行显示更改的内容,新启动的 cmd 窗口以双引号开头。
盆地,该站点旨在为有问题的代码提供问题的答案。您似乎没有提出问题,也没有暗示您的代码存在问题。因此,问题要么简单地发表声明,这意味着您需要一个博客,要么寻求参考资料,这意味着您需要一个不同的站点,因为这种类型的请求在这里是题外话。因此请edit the post使其成为话题或删除它并找到更合适的平台;谢谢。
【参考方案1】:
您找到了well known cmdcmdline
effect。
这是显示这种非常有用的行为的唯一变量。
它很有用,因为它可以很好地检查解析器的工作原理。
就像问题一样,如果解析器在 REM
或标签之后扩展变量?
顺便提一句。它也适用于延迟扩展
@echo off
echo %CMDCMDLINE%
REM %CMDCMDLINE:C:=1#%
: %CMDCMDLINE:"=X%
echo %CMDCMDLINE%
应避免使 cmdcmdline 变量长于初始长度,因为这会导致 cmd.exe 崩溃
【讨论】:
当解析器检测到变量读取时,将调用GetEnvVar
函数。这里分配一个缓冲区来存储从GetEnvironmentVariableW
API 返回的数据,如果变量存在并且返回一个指向该缓冲区的指针。如果变量不存在,则检查动态变量列表。对于CMDCMDLINE
,调用GetCommandLineW
,返回的指向当前进程的命令行字符串的指针由GetEnvVar
而不是返回,而不是指向内部缓冲区的指针。由于子字符串/替换操作在指定的数据上就地执行,...
@MCND 感谢您的调试会话。我只做了黑盒测试,但很高兴知道问题的真正原因以上是关于%CMDCMDLINE% 特殊变量被神奇地改变了,虽然没有赋值的主要内容,如果未能解决你的问题,请参考以下文章