2010-01-19 2 views
44

Ich habe ein PowerShell-Skript, das du.exe (Disk Usage ursprünglich von Sysinternals) verwendet, um die Größe von Verzeichnissen zu berechnen.Fehler beim Aufrufen einer ausführbaren Datei von Drittanbietern aus Powershell bei Verwendung einer IDE

Wenn ich du c:\Backup in der Konsole laufen, es funktioniert wie erwartet, aber die gleiche Codezeile Lauf in ISE oder PowerGUI gibt das erwartete Ergebnis und den Fehler

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

Warum ist das so? Wie vermeide ich diesen Fehler? Ich versuchte invoke-expression mit &, aber nicht gehen.

Danke für die Hilfe.

+0

Beachten Sie, dass, wenn Sie '$ ErrorActionPreference' auf' Stop' diese gesetzt haben tatsächlich das Skript die Hinrichtung zu stoppen. Meine Lösung war, es auf 'Continue' zu ​​setzen, den Befehl aufzurufen und auf' Stop' zurückzusetzen. –

Antwort

34

Um dies zu vermeiden Sie stderr umleiten können z auf null .:

du 2> $null 

Wesentlichen die Konsole Host und ISE (sowie Remoting) unterschiedlich behandeln die stderr-Stream. Auf dem Konsolenhost war es wichtig, dass PowerShell Anwendungen wie edit.com unterstützt, die mit anderen Anwendungen zusammenarbeiten, die farbige Ausgaben und Fehler auf dem Bildschirm schreiben. Wenn der E/A-Stream nicht auf dem Konsolenhost umgeleitet wird, gibt PowerShell der nativen EXE ein Konsolenhandle, auf das direkt geschrieben werden kann. Dadurch wird PowerShell umgangen, sodass PowerShell nicht sehen kann, dass Fehler geschrieben wurden, sodass der Fehler nicht über $ error oder durch Schreiben in den stderr-Stream von PowerShell gemeldet werden kann.

ISE und Remoting müssen dieses Szenario nicht unterstützen, damit sie die Fehler in stderr sehen und anschließend den Fehler schreiben und $ error aktualisieren.

+0

Vielen Dank. Es hat perfekt funktioniert. Lucas – Lucas

+0

Den Tag gerettet.Perfekt! – Thomas

+0

Gut mit PSEXEC gearbeitet! Vielen Dank! –

31

Ich habe vor kurzem die gleichen Probleme konfrontiert, aber ich möchte die stderr Ausgabe auf stdout gerichtet bekommen. Sie würden denken, dass die folgenden funktionieren würde:

& du 2>&1 

Aber Powershell wird die Umleitung und verarbeiten sie nach ‚du‘ ist abgeschlossen interprete. Die Behelfslösung fand ich ist es aufzurufen cmd.exe/C unter Verwendung von:

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

Dieser arbeitete für mich, wo ich die Antwort von KeithHill nicht verwenden konnte. Danke SimonEjsing! – mbourgon

+0

Dies funktionierte für mich, ohne in den CMD-Kontext auszuführen, habe ich immer noch den Fehler. –

+3

Das hat für mich funktioniert. Ich musste auch Optionen übergeben, also war die vollständige Syntax für mich '' '& cmd/c 'foo.exe 2> & 1' option1 option2'''. (Beachten Sie, dass nur der Name der ausführbaren Datei und die '2> & 1' in die Hochkommas gehen.) – user2441511

8

andere Möglichkeit, die NativeCommandError Ausgang zu unterdrücken, ist es, den Objekte in der Pipeline zu Strings konvertieren wie unten umrissen von this answer:

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

Versuchen:

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

Previ ous FIX leitet Fehler um, aber Sie könnten einen echten Fehler verlieren, wenn beispielsweise Ihr Benutzername oder Ihr Passwort nicht gut sind oder wenn Sie eine integrierte Authentifizierung verwenden, auf die Sie keinen Zugriff haben.

Also hier ist ein Weg, um die Fehlerbehandlung zu implementieren und den spezifischen Fehler (der keine ist) von psexec ausgelöst.

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

Wenn Sie den Rest des Codes ausfüllen können, um ihn kompilierbar zu machen, ist der Code derzeit ungültig. – sean

Verwandte Themen