DOS环境设置不同的行为,if语句,在DOS提示符下相比,Windows快捷方式(Different

2019-10-29 06:34发布

这看起来很简单,但原来是这么痛。

在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

但是把这个相同的命令变成快捷方式的时候,我得到这样的:

到底是怎么回事?

Answer 1:

首先我会从命令提示符下运行代码的角度入手。 你有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