这看起来很简单,但原来是这么痛。
在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
但是把这个相同的命令变成快捷方式的时候,我得到这样的:
到底是怎么回事?
首先我会从命令提示符下运行代码的角度入手。 你有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 . . .
文章来源: Different behaviour of DOS Environment setting, in if statement, in DOS prompt as compared to Windows Shortcut