2009-06-08 64 views
2

首先,要麼A)我沒有調查到這足夠硬或B)我發現一個問題,需要一些時髦的黑客。順便說一句,這是豪華v1.0。輸出重定向/捕獲問題與Powershell和Try-Catch和外部EXE

這裏有雲:

一個星期左右前,我問了一個問題關於在PowerShell中的EXE這是沒有,否則被抓住的exection輸出重定向。我很快提出了「2> & 1」,它解決了這個問題。

現在我又碰到了另一個障礙,希望看到你們中的一些人可以扔到它。

我在我的代碼中使用try-catch塊作爲一名優秀的程序員應該。當我去的地方,GPG(gnupg.org)的調用,傳遞給它一些命令如下:

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

得到了一個空白的文本文件(theOutput.txt)。

但是,如果我做同樣的呼叫外try-catch塊的,文本文件獲取預期寫入一些文本。

我想知道的是,如果輸出重定向到標準輸出和PowerShell陷阱異常的方式有問題 - 或者它是我的嘗試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參數。介意分享您的實施,看看是否可能導致問題?

順便說一句我懷疑你的catch語句會被調用,除非你將$ lastexitode -ne 0的非終止錯誤條件轉換爲終止錯誤。在這種情況下,使用這種功能可能會更好。我用了很多(這是相當方便的):

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 2009-06-08 17:45:55