2

ベンダー アプリケーションの展開スクリプトに取り組んでいます。さまざまな環境の展開パスをマップする xml を読み取り、さまざまなサーバーを反復処理して正しいファイルをコピーし、ロールアウト スクリプトを実行します。ロールアウト スクリプトが失敗した場合、スクリプトを終了させたいです。ロールアウト スクリプトは perl スクリプトであり、その前に .bat を呼び出して一連の環境変数を設定する必要があります。perl スクリプトの実行時に env.bat が設定するシステム変数を引き続き使用できるように、以下に示すように & でつながれたコマンドをすべて発行しました。

$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 コマンドは次のようになります。

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の経験が限られているため、私のアプローチに対する他の提案は大歓迎です。

4

1 に答える 1

0

すぐに解決策を見つけました。戻りコードのエコーを $cmdString に追加し、invoke-command を使用してリモート変数をローカル インスタンスに戻し、戻りコードの結果を調べました。

$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
于 2012-08-01T16:40:27.163 に答える