2010-01-19 29 views
44

J'ai un script PowerShell qui utilise du.exe (Disk Usage provenant de Sysinternals) pour calculer la taille des répertoires.Erreur lors de l'appel d'un exécutable tiers de Powershell lors de l'utilisation d'un IDE

Si je lance du c:\Backup dans la console, il fonctionne comme prévu, mais la même ligne de code execute ISE ou PowerGUI donne le résultat attendu, plus l'erreur

+ du <<<< c:\backup 
+ CategoryInfo   : NotSpecified: (:String) [], RemoteException 
+ FullyQualifiedErrorId : NativeCommandError 

Pourquoi? Comment éviter cette erreur? J'ai essayé invoke-expression, en utilisant &, mais pas aller.

Merci pour l'aide.

+0

Notez que si vous avez '$ ErrorActionPreference' à' Stop' cela fait arrêter l'exécution de votre script. Ma solution était de le mettre à Continue, d'invoquer la commande et de la remettre à Stop. –

Répondre

34

Pour éviter cela, vous pouvez rediriger stderr vers null .: par exemple

du 2> $null 

Essentiellement l'hôte de la console et ISE (ainsi que Remoting) traiter le flux stderr différemment. Sur l'hôte de la console, il était important pour PowerShell de supporter des applications comme edit.com pour travailler avec d'autres applications qui écrivent des sorties colorées et des erreurs sur l'écran. Si le flux d'E/S n'est pas redirigé sur l'hôte de la console, PowerShell donne à l'EXE natif un handle de console à écrire directement. Cela contourne PowerShell et PowerShell ne peut pas voir qu'il y a des erreurs écrites, donc il ne peut pas signaler l'erreur via $ error ou en écrivant dans le flux stderr de PowerShell. ISE et à distance n'ont pas besoin de prendre en charge ce scénario afin qu'ils voient les erreurs sur stderr et ensuite écrire l'erreur et mettre à jour l'erreur $.

+0

Merci beaucoup. Cela a fonctionné parfaitement. Lucas – Lucas

+0

Sauvé le jour.Parfait! – Thomas

+0

A travaillé très bien avec PSEXEC! Merci! –

31

J'ai récemment fait face aux mêmes problèmes, mais j'aimerais que la sortie de stderr soit dirigée vers stdout. On pourrait penser que ce qui suit fonctionnerait:

& du 2>&1 

Mais PowerShell interprete la redirection et le processus après « du » est terminée. Le est au travail autour, je trouve l'appeler en utilisant cmd.exe/c:

& cmd /c 'du 2>&1' 
+0

Celui-ci a fonctionné pour moi où je ne pouvais pas utiliser la réponse de KeithHill. Merci SimonEjsing! – mbourgon

+0

Cela a fonctionné pour moi, sans exécuter dans le contexte de cmd j'ai toujours eu l'erreur. –

+3

Cela a fonctionné pour moi. J'avais aussi besoin de passer des options, donc la syntaxe complète pour moi était '' '& cmd/c 'foo.exe 2> & 1' option1 option2'''. (Notez que seul le nom de l'exécutable et le '2> & 1' vont dans les guillemets simples.) – user2441511

8

Une autre façon de supprimer la sortie NativeCommandError est de convertir les objets dans le pipeline à cordes décrites au fond de this answer:

du c:\Backup 2>&1 | %{ "$_" } 
3

Essayez:

du 2>&1 | %{ "$_" } 
1

Previ ous FIX redirigera les erreurs mais vous pourriez perdre une vraie erreur si, par exemple, votre nom d'utilisateur ou mot de passe n'est pas bon ou si vous utilisez l'authentification intégrée, vous n'avez pas accès.

Voici donc un moyen d'implémenter la gestion des erreurs et de contourner l'erreur spécifique (qui n'en est pas une) soulevée par psexec.

try{ 
 
      \t psexec command ..... 
 
      } 
 
      catch [System.Management.Automation.RemoteException]{ 
 
       if ($_.TargetObject -like "Connecting to *" -and $_.CategoryInfo.Category -eq "NotSpecified" -and $_.FullyQualifiedErrorId -eq "NativeCommandError" -and $_.InvocationInfo.MyCommand.Name -like "psexec*.exe"){ 
 
        $error.Remove[$Error[0]] 
 
       } 
 
       else{ 
 
        Throw 
 
       } 
 
      }   
 
      catch{ 
 
       throw 
 
      }

+0

Si vous pouvez remplir le reste du code pour le rendre compilable, comme c'est le cas actuellement, le code n'est pas valide. – sean