2009-06-08 60 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