2017-01-18 22 views
0

PowerShellのリモートコンピュータからの引数を含む実行可能ファイルを実行しようとしていますが、実行ファイルがスローするエラーを適切に処理します。PowerShellで実行可能ファイルを実行し、実行可能ファイルのエラーコードを正しく返すようにしました

ファイル$ filenameが存在する限り、以下のスクリプトは期待通りに実行されますが、ファイルがなければスクリプトは正常に実行されるようにも見えますが、スケジューラの問題につながります。に。私の期待は、PowerShellが "ファイルが見つかりません"などのエラーをスローすることですが、それは起こっていません。それで、このスクリプトにその動作を起こすために追加できるものは何ですか?

$ErrorActionPreference = "stop" 
$rSession = New-PSSession -ComputerName ServerName 
$fileName = c:\file.txt 
Invoke-Command -ScriptBlock {Start-Process -FilePath "D:\CAMRA\PFX\PFLNS.EXE" -ArgumentList " /SD:\CAMRA\CAMINI\Z_PRODNP_SQL_TEST.INI GLSWEEP 50 {DN}~$fileName~{T}" -Wait} -Session $rSession 
Remove-PSSession $rSession 

は、私が私が探しています何をするのPowerShellを通じて正しく.exeファイルを呼び出しておりませんので、私は、私は、このスクリプトを変更するカムどのように任意の提案に開いているであろうことも可能です。

おかげで、

+0

([スタートプロセスと代わり-waitのWaitForExitを使用して終了コードを取得する]の可能な重複http://stackoverflow.com/questions/10262231/obtaining-exitcode-using-start-process-and-waitforexit-代わりに待っている) – jveazey

答えて

1

私はこれがあなたが望むようなものだと思います。

まず、コマンドを別のスクリプトブロックに分割し、不正な終了コードを追加するコードを追加できるようにしました。

第2に、終了コードを取得するには、Start-Process-PassThruパラメータが必要です。いったん終了コードを取得できたら、それを評価し、0でなければ、上位のInvoke-Commandをクラッシュさせるエラーをスローします。

第3に、特別な$?変数を使用して前のコマンド(Invoke-Command)が成功したかどうかをキャッチし、失敗した場合はスケジューリングプログラムによってキャッチされるエラーをスローします。

$ErrorActionPreference = "stop" 
$rSession = New-PSSession -ComputerName ServerName 
$arg = "c:\file.txt" 

$ScriptBlock = { 
    param ([String]$fileName) 
    $output = Start-Process -FilePath "D:\CAMRA\PFX\PFLNS.EXE" -ArgumentList " /SD:\CAMRA\CAMINI\Z_PRODNP_SQL_TEST.INI GLSWEEP 50 {DN}~$fileName~{T}" -Wait -PassThru 
    if ($output.ExitCode -ne 0) { 
      throw $output.ExitCode 
    } 
} 

Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList $Arg -Session $rSession 
if (!$?) { 
    #Failure Throw an error code 
    throw 123 
} 

Remove-PSSession $rSession 
+0

これは私が何をしようとしているように働くようです。 私はpowershellの変数の割り当てに少し混乱しているようです。 $ fileName変数の値がどのように割り当てられているかをepically私は$出力変数がどのように働いているかについてもあまりよく分かりませんが、自分でそれを調べることができると確信しています。 –

0

フィルは、スクリプトブロックに引数を渡していますか? $FileName$($Args[0])に置き換え、-ArgumentList $FileNameをInvoke-Commandのパラメータに追加します。

... GLSWEEP 50 {DN}~$($args[0])~{T}" -Wait} -ArgumentList $FileName -Session $rSession 
関連する問題