Frage

Ich habe ein Powershell-Skript, dass Anwendungen du.exe ( Disk Usage ursprünglich von Sysinternals), um die Größe der Verzeichnisse zu berechnen.

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 habe versucht, invoke-expression, mit &, aber nicht gehen.

Danke für die Hilfe.

War es hilfreich?

Lösung

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

du 2> $null

Im Wesentlichen der Konsole Host und ISE (sowie Remoting) unterschiedlich behandeln den stderr-Stream. Auf der Konsole Gastgeber war es wichtig, für Powershell-Unterstützung Anwendungen wie edit.com zu arbeiten zusammen mit anderen Anwendungen, die Ausgabe und Fehler auf den Bildschirm farbig schreiben. Wenn die I / O-Stream nicht auf Konsole Host umgeleitet wird, gibt Powershell die native EXE eine Konsole Handle direkt zu schreiben. Dies umgeht Powershell so Powershell kann nicht sehen, dass es Fehler geschrieben, damit es nicht den Fehler über $ Fehler melden kann oder zu Powershell Stderr Stream zu schreiben.

ISE und Remoting brauchen nicht dieses Szenario zu unterstützen, damit sie die Fehler auf stderr sehen tun und schreiben anschließend den Fehler und Update $ Fehler.

Andere Tipps

Ich habe vor kurzem die gleichen Probleme wurden mit Blick auf, 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 verarbeitet es nach ‚mir‘ interprete abgeschlossen ist. Die Work-around Ich fand es aufzurufen cmd.exe / c mit:

    & cmd /c 'du 2>&1'

Eine andere Möglichkeit, die NativeCommandError Ausgabe zu unterdrücken, ist die konvertieren Objekte in der Pipeline zu Strings , wie unten skizziert von diese Antwort :

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

Versuchen Sie:

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

Zurück FIX Fehler umleiten, aber Sie könnten einen echten Fehler verlieren, wenn durch das Beispiel der Benutzername oder das Passwort nicht gut ist oder wenn integrierte Authentifizierung verwenden, können Sie keinen Zugriff haben.

So, hier ist eine Möglichkeit, die Fehlerbehandlung und Bypass-spezifischen Fehler zu implementieren (dh nicht ein) durch psexec erhöht.

 try{
            	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
            }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top