0

这看起来很简单,但结果却是如此痛苦。

在 Windows 7 上,我可以将以下内容粘贴到命令提示符中并将其设置ProgramFiles(x32)%programfiles%或者%programfiles(x86)%然后回显其设置为:

%comspec% /c if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%") && set Program && echo %programfiles(x32)% && pause

但是,当将相同的命令放入快捷方式时,我得到了这个:

显示 ProgramFiles(x32) 的命令提示符已预先设置,但后续回显未看到

到底是怎么回事?

4

1 回答 1

2

首先,我将从在命令提示符下运行代码的角度开始。在这种情况下,您的代码有 4 个问题。

1)我不认为这有什么不同,但我相信你总是想在你的命令行中执行最后 3 个命令。但是您使用了条件&&运算符,如果前面的命令成功,它只会执行下面的命令。我相信你想&改用。

2)你有一个优先问题。您想要执行一个 IF/ELSE 语句,然后当它完成时您想要执行 3 个附加命令。但是您编写的 3 个附加命令被认为是 IF 语句的 ELSE 子句的一部分。您需要在整个 IF/ELSE 语句周围使用一组额外的括号。

(if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "ProgramFiles(x32)=%programfiles(x86)%")) & ...

3) 您希望之后的所有内容都%comspec% /c成为传递给 CMD.EXE 的命令行的一部分。但是,当您在命令行控制台中运行整个语句时,对 CMD.EXE 的调用会在&. 该行的其余部分由父命令窗口执行,而不是由您对 CMD.EXE 的调用执行。您需要将&字符转义为^&,或者引用要传递的整行。

4) %VAR% 扩展发生在解析一行时,并且在执行任何命令之前一次解析整个命令行。因此,您看到的 %ProgramFiles(x32)% 的值是执行任何命令之前的值。该值通常未定义,并且您处于命令行上下文中,因此会打印带有百分比的原始字符串。修复方法是使用CALL ECHO %^ProgramFiles(x32)%或启用延迟扩展/V:ON选项并使用ECHO !ProgramFiles(x32)!. 插入符号是为了确保将字符串传递给 CMD.EXE 而不是在父命令行中展开(以防万一 ProgramFiles(x32) 已定义)。

以下每一项都应提供您在命令提示符下查找的结果:

%comspec% /v:on /c "(if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & echo !programfiles(x32)!& pause"

%comspec% /c "(if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & call echo %^programfiles(x32)%& pause"

%comspec% /v:on /c (if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) ^& set Program ^& echo !programfiles(x32)!^& pause

%comspec% /c (if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) ^& set Program ^& call echo %^programfiles(x32)%^& pause

从快捷方式执行时,情况会有所不同。该快捷方式没有父命令提示符,因此上述第 3) 点不适用。&不应转义字符,但仍可以引用整个命令行。

点 1、2 和 4 对快捷方式仍然有效。

因此,以下语句都将用作快捷方式:

%comspec% /v:on /c "(if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & echo !programfiles(x32)!& pause"

%comspec% /c "(if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & call echo %^programfiles(x32)%& pause"

%comspec% /v:on /c (if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & echo !programfiles(x32)!& pause

%comspec% /c (if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & call echo %^programfiles(x32)%& pause

比较 2 组语句,其中只有 2 组对两种上下文都有效。以下 2 条语句可在命令行和快捷方式中使用:

%comspec% /v:on /c "(if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & echo !programfiles(x32)!& pause"

%comspec% /c "(if exist "%programfiles%" (set "ProgramFiles(x32)=%programfiles%") else (set "%ProgramFiles(x32)=%programfiles(x86)%")) & set Program & call echo %^programfiles(x32)%& pause"

当从命令提示符或作为我的 Vista 机器上的快捷方式发出时,上述两个语句都会给出以下结果:

ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x32)=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
C:\Program Files
Press any key to continue . . .
于 2012-08-16T12:40:04.163 回答