2012-01-15 43 views
0

我想,以確定哪些PATH環境變量是在我運行如何在執行cmd/c「command」後確定PATH環境變量?

cmd /c "vcvarsall.bat x86_amd64 && echo %PATH%" 

執行批處理文件(vcvarsall.bat),但發生的事情是不是我所期望的。例如,如果我運行:

cmd /c "set PATH=test && echo %PATH%" 

我剛剛得到主機的過程,而不是「測試」如我所料,回聲%PATH%應該在子進程的上下文中運行,而不是路徑家長。那麼,爲什麼會發生這種情況呢?我如何才能獲得我所追求的結果呢?

回答

3
cmd /c "set PATH=test && echo %PATH%" 

會解釋它改變了PATH之前。這實際上是一個巧妙的方法來導出環境變量setlocal/endlocal塊外有:

ste xyzzy=twisty 
startlocal 
set xyzzy=plugh 
endlocal && set xyzzy=%xyzzy% 

通常情況下(不&& xyzzy=...一下,xyzzy變量仍然是曲折的塊之後的初始值,但事實%xyzzy%是之前解釋整個endlocal線而setendlocal命令後付諸行動,讓你導出的變化。

如果你想set,Y後解釋變量OU需要延遲擴展:

cmd /v:on /c "set PATH=test && echo !PATH!" 

/v:on開啓延遲擴展和使用!代替%表明您想使用延遲擴展。

+0

如果延遲擴展已啓用,則失敗 - 請參閱[我的答案](http://stackoverflow.com/a/8870200/1012053) – dbenham 2012-01-15 14:08:22

2

如果在父環境中啓用延遲擴展時使用paxdiablo解決方案將不起作用。

從一個批處理文件

@echo off 
setlocal enableDelayedExpansion 
rem !PATH! below will get expanded in parent batch environment 
cmd /v:on /c "set PATH=test && echo !PATH!" 

,或者在命令行

cmd /v:on 
rem !PATH! below will get expanded in parent batch environment 
cmd /v:on /c "set PATH=test && echo !PATH!" 

簡單的解決辦法就是逃跑的擴張,使其被延遲,直到你在新的CMD環境。

cmd /v:on 
rem This works whether or not delayed expansion is enabled in the parent environment 
cmd /v:on /c "set PATH=test && echo ^!PATH^!" 

注意/ V:在第二CMD仍然是必需的,因爲CMD不從父環境繼承推遲擴張狀態。