2012-08-01 163 views
2

我正在開發供應商應用程序的部署腳本。它讀取映射各種環境的部署路徑的xml,然後遍歷各種服務器並將正確的文件複製並執行該轉出腳本。如果轉出腳本失敗,我希望腳本退出。部署腳本是一個perl腳本,我需要先調用.bat來設置一堆環境變量。我已經發行的所有與&的串成這些命令,你可以看到下面,使得系統變量env.bat文件集仍然可用perl腳本運行時:Powershell調用命令腳本返回碼

$cmdString = $destDrive + ": & call "+$lesDestDir+"data\env.bat & cd "+$rolloutDir+" & perl ..\JDH-rollout-2010.pl "+$rollout+" NC,r:\les" 
write-host "cmdString: " $cmdString 
Invoke-Command -session $session -ScriptBlock {cmd /v /k `"$args[0]`"} -args $cmdString 

的調用命令如下像這樣用變量代換:

Invoke-Command -session $session -scriptblock {cmd /k "D: & call D:\XXXX\env.bat & cd D:\XXXX\RO-00102 & perl ..\JDH-rollout-2010.pl RO-00102 NC,r:\les"} 

所以,問題是我怎麼可以從Perl腳本(這是在cmd中的上下文中運行的命令字符串中的最後一個命令)的返回碼返回到本地機器在哪裏運行腳本?對於我的方法,任何其他建議都是受歡迎的,因爲我的PowerShell經驗有限。

+0

是否有一個原因,你是從cmd而不是Powershell設置環境變量? – SpellingD 2012-08-01 14:32:38

+0

是的,它是供應商提供的腳本,每個環境都有所不同。我不想將它們的腳本轉換爲PowerShell,然後負責維護腳本,如果腳本發生變化。 – 2012-08-01 14:44:18

回答

0

我很快找到了解決方案。我添加返回代碼,以我的$ cmdString的回聲,然後使用調用命令返回遠程變量回本地實例,然後我詢問的返回碼結果:

$cmdString = $destDrive + ": & call "+$lesDestDir+"data\env.bat & cd "+$rolloutDir+" & perl ..\JDH-rollout-2010.pl "+$rollout+" NC,r:\les & echo ExitCode:!errorlevel!" 
write-host "cmdString: " $cmdString 

Invoke-Command -session $session -ScriptBlock {$res = cmd /v /k `"$args[0]`"} -args $cmdString 
$res = Invoke-Command -session $session {$res}  
Write-Host "Return code: " $res  
$res = [string] $res   
$exitCode = $res.substring($res.IndexOf("ExitCode:"), 10)  
Write-Host "Exit code: " $exitCode