2009-06-08 7 views
2

Tout d'abord, soit A) Je n'insiste pas assez sur ce sujet ou B) J'ai trouvé un problème qui nécessite un bidouillage funky. En passant, c'est chic v1.0.Problème de redirection/capture Ouput avec Powershell et Try-Catch et EXE externe

Ici, il va:

Une semaine ou alors j'ai demandé il y a une question sur redirigeant la sortie du exection d'un EXE dans Powershell qui était par ailleurs ne pas être pris. Je suis rapidement présenté avec « 2> & 1 » qui a résolu le problème.

Maintenant, j'ai frappé un autre accroc et l'espoir de voir ce que certains d'entre vous stackoverflowers peut jeter.

J'utilise des blocs try-catch à travers mon code comme un bon programmeur doit. Quand je suis allé passer un appel à GPG (gnupg.org), en lui passant quelques commandes comme suit:

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

je reçois un fichier texte vide (theOutput.txt).

Mais si je fais le même appel en dehors de du bloc try-catch, le fichier texte obtient du texte écrit comme prévu. Ce que je me demande, c'est s'il y a un problème avec la redirection de sortie vers stdout et la façon dont powershell piège les exceptions - ou si c'est mon code try-catch pour commencer?

ici est ma mise en œuvre 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 
    } 
}; 

Répondre

2

Il semble que vous utilisez une fonction personnalisée Essayez avec un paramètre -CATCH. Vous avez pensé partager votre implémentation pour voir si cela pouvait causer le problème?

BTW je doute que votre déclaration de capture ne jamais être invoquée à moins que vous convertissez la condition d'erreur sans fin de lastexitode -ne 0 $ à une erreur de terminaison. Dans ce cas, vous pouvez être mieux avec une fonction comme celle-ci. Je l'utilise beaucoup (il est tout à fait à portée de main):

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)" 
    } 
} 

Utilisez comme si:

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

Je suis heureux et na pas déclencher lu votre code. Je vais l'essayer et voir ce qui se passe. Je vous en suis reconnaissant. – CLR

+0

Succès! Appelé gpg avec quelques mauvais arguments et il a attrapé le code retour avec facilité. J'apprécie le temps que vous avez pris pour aider. À votre santé! – CLR

+0

est toujours valable pour PowerShell 2.0? – Kiquenet