2012-07-29 168 views
1

我正在爲供應商應用程序自動化修補程序。我想使用powershell遍歷服務器列表,並使用遠程處理在每個盒子上安裝。但是,一方面讓我很頭痛。我必須在執行安裝腳本之前調用供應商提供的cmd腳本來設置系統變量。因此,我調用腳本像這樣在PowerShell中:Powershell調用命令和系統變量

Invoke-Command -session $session {cmd /k ($args[0]+"\data\env.bat")} -Args $lesDestDir 

我看到它執行,因爲它迴響在我的PowerShell窗口中工作,但隨後的安裝腳本調用即:

Invoke-Command -session $session {perl ".\rollout-2010.pl " $args[0] " NC"} -Args $rollout 

立即退出說它使用的各種系統變量尚未設置。有人可以向我解釋系統變量的範圍嗎? invoke-command完成後它們是否停止存在?我是否需要將單個invoke-command中的兩個腳本調用串在一起,以便第二個腳本可以訪問系統變量或類似的東西?

回答

3

所做的更改。

如果有可能使用PowerShell的語法設置環境變量:

Invoke-Command -session $session {$env:myvar = 1} 

另外,您可以使用字符串cmd命令分離&這樣的命令:

Invoke-Command -session $session {cmd /k "set myvar = 1" `& "set"} 
+0

也許我失去了一些東西,但不應該如下回顯1的值: Invoke-Command -session $ session {cmd/k「set myvar = 1」'&「echo%myvar%」} 它不產生ou tput的。 – 2012-07-29 15:27:09

+1

讀取命令時(在命令中設置之前)會發生變量擴展。要延遲變量的擴展,請在調用cmd.exe時添加/ v開關並使用!而不是%:Invoke-Command -session $ session {cmd/v/k「set mytar = 2&echo!mytar!」} – 2012-07-29 16:31:05

+0

謝謝你們的例子和清楚的解釋。我能夠完成我正在從事的工作。 – 2012-07-29 20:38:44

0

是的,你需要把它們串在一起。環境變量正在退出的第一個cmd會話中設置,然後第二個會在沒有它們的情況下啓動。使用SET命令被永久的,它們適用於當前cmd只是過程,並保持,直到cmd過程結束