首先,我将从在命令提示符下运行代码的角度开始。在这种情况下,您的代码有 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 . . .