2009-06-08 4 views
2

最初に、A)私はこれについて十分に調査していないか、B)ファンキーなハッキングを必要とする問題を発見しました。ところで、これは華麗なv1.0です。PowershellとTry-Catchと外部EXEでの出力リダイレクション/キャプチャの問題

ここにそれが行く:1週間

ほど前、私はそうでない場合はキャッチされていなかったPowerShellでEXEの・実行からの出力をリダイレクトについての質問をしました。私はすぐに問題を解決した "2> & 1"を提示されました。

今私は別の邪魔をしたことがあり、あなたのうちの何人かがそれに投げることができるものを見たいと思っています。

私は良いプログラマーとしてコード内でtry-catchブロックを使用しています。私は次のようにそれをいくつかのコマンドを渡し、GPG(gnupg.org)への呼び出しを配置するために行ったとき:

try ` 
{ 
    & $gpgExeLocation --import $keyFileName 2>&1 | out-file "theOutput.txt"; 
} ` 
-Catch ` 
{ 
    write-host "$_"; 
} 

私は、空のテキストファイル(theOutput.txt)を取得します。

私はtry-catchブロックのの外に以外のコールを行うと、テキストファイルに期待どおりのテキストが書き込まれます。

stdoutへの出力リダイレクトの問題と、powershellが例外をトラップする方法に問題がある場合、またはそれが私のtry-catchコードで始まるのではないかと疑問に思っています。

は、ここに私のtry-catch実装

function global:try 
{ 
    param 
    (
     [ScriptBlock]$Command = $(Throw "The parameter -Command is required."), 
     [ScriptBlock]$Catch = { Throw $_ }, 
     [ScriptBlock]$Finally = {} 
    ) 

    & { 
     $local:ErrorActionPreference = "SilentlyContinue" 

     trap 
     { 
      trap 
      { 
       & { 
        trap { Throw $_ } 
        &$Finally 
       } 

       Throw $_ 
      } 

      $_ | & { &$Catch } 
     } 

     &$Command 
    } 

    & { 
     trap { Throw $_ } 
     &$Finally 
    } 
}; 

答えて

2

あなたが-Catchパラメータでカスタムtry関数を使用している表示されています。それが問題を引き起こす可能性があるかどうかを確認するために実装を共有することを心に留めてください。

私は、$ lastexitode -ne 0の終了していないエラー状態を終了エラーに変換しない限り、catchステートメントが呼び出されるのではないかと疑います。この場合、このような関数を使うほうが良いでしょう。

function Get-CallStack { 
    trap { continue } 
    1..100 | foreach { 
     $var = Get-Variable -scope $_ MyInvocation 
     $var.Value.PositionMessage -replace "`n" 
    } 
} 

#-------------------------------------------------------------------- 
# Helper function to deal with legacy exe exit codes 
#-------------------------------------------------------------------- 
function CheckLastExitCode { 
    param ([int[]]$SuccessCodes = @(0), [scriptblock]$CleanupScript=$null) 

    if ($SuccessCodes -notcontains $LastExitCode) { 
     if ($CleanupScript) { 
      "Executing cleanup script: $CleanupScript" 
      &$CleanupScript 
     } 
     $OFS = $NL = [System.Environment]::NewLine 
     throw "EXE RETURNED EXIT CODE ${LastExitCode}${NL}$(Get-CallStack)" 
    } 
} 

ので、同じようにそれを使用してください:私は幸せトリガー持って、あなたのコードを読んでいませんでし

& $gpgExeLocation --import $keyFileName 2>&1 | out-file "theOutput.txt" 
CheckLastExitCode 
+0

私はそれに多く(それは非常に便利です)を使用します。私はそれを試して、何が起こるか見るつもりです。それは有り難いです。 – CLR

+0

成功!いくつかの悪い引数でgpgを呼び出し、それは簡単に戻りコードをキャッチしました。あなたが手伝ってくれた時を感謝します。乾杯! – CLR

+0

はpowershell 2.0でも有効ですか? – Kiquenet

関連する問題