gpt4 book ai didi

windows - 为什么空变量会导致崩溃

转载 作者:可可西里 更新时间:2023-11-01 11:45:17 26 4
gpt4 key购买 nike

使用空变量不一定会导致崩溃。但是在 IF 情况下使用它们会使程序崩溃。为什么?即使 EnableDelayedExpansion 没有在这里设置,为什么不是例如下面的变量 PATHDEF 没有被视为空变量?

使用输入 APP 调用以下脚本将导致崩溃并显示不同的错误消息。 (即我使用输入参数调用下面的脚本,这将导致 IF 评估为 true)

在 Windows 控制台上:\Intel\iCLS 此时出现异常。

在 Bamboo 服务器上:\Graphviz2.38\bin 此时是意外的。

echo off

SET app=%1
SET PATHDEF=%PATH%

echo %PATHDEF% <--- This works. Prints path

echo %THIS% <--- This works. Prints "ECHO is off" (since %THIS% is empty)

IF %app%==APP (
echo %PATHDEF% <--- This causes crash!
)

最佳答案

发生这种情况是因为 %PATH% 中未转义的右括号。 PATH 变量中的第一项是 C:\Program Files (x86)\Intel\iCLS Client\

变量在运行时展开,所以

IF %app%==APP (
echo %PATHDEF%
)

实际上被解读为

IF %app%==APP (
echo C:\Program Files (x86)\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;
)

由于 cmd 解释器解析括号的方式,它决定第一个未加引号、未转义的右括号是代码块的结尾,因此您的代码将被视为您编写的代码

IF %app%==APP (
echo C:\Program Files (x86
)
\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;

由于首先处理代码块之外的内容,脚本识别出 \Intel\iCLS 不是有效命令,因此它在那里抛出错误而不是回显 C:\程序文件(x86


有两种方法可以避免这种情况:

选项一 - 将变量放在引号中

IF %app%==APP (
echo "%PATHDEF%"
)

不幸的是,这意味着引号在显示时会被包含在内。

选项二 - 将所有内容放在同一行

IF %app%==APP echo %PATHDEF%

没有左括号把一切搞乱,内容将正确打印,无需引用或转义任何内容。

关于windows - 为什么空变量会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47394258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com