%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% 特殊变量被神奇地改变了,虽然没有赋值的主要内容,如果未能解决你的问题,请参考以下文章

React 状态无缘无故地神奇地改变

使用 SetColorFilter 神奇地改变图片的颜色

Delphi 中全局变量无法被修改

Mysql 遇到神奇的“本次本客户端效现象”,数据库并未被改变 + 神奇“卡顿现象”

为何关键字static在面试中频频被问?

添加 HTML 表单标签时,JavaScript 执行,但神奇地消失了