Powershell - leitet den stderr der ausführbaren Datei in eine Datei oder eine Variable um, muss aber trotzdem zur Konsole gehen

8

Ich schreibe ein Skript, um mehrere Repositories von GitHub herunterzuladen. Hier ist der Befehl zum Herunterladen eines Repos:

%Vor%

Wenn ich diesen Befehl ausführe, zeigt er einige nützliche Fortschrittsinformationen in dem Konsolenfenster an, das ich anzeigen möchte.

Das Problem ist, dass ich auch erkennen möchte, ob beim Herunterladen Fehler aufgetreten sind. Ich fand diesen Beitrag das redet über die Umleitung der verschiedenen Streams , also habe ich versucht:

%Vor%

Damit werden Fehler von stderr an meine Datei weitergeleitet, aber die Informationen über den guten Fortschritt werden nicht mehr in der Konsole angezeigt.

Ich kann das Tee-Objekt so benutzen:

%Vor%

und ich bekomme immer noch die nette Fortschrittsausgabe, aber das puffert stdout an die Datei, nicht stderr; Ich bin nur mit der Erkennung von Fehlern beschäftigt.

Gibt es eine Möglichkeit, Fehler in einer Datei oder (vorzugsweise) einer Variablen zu speichern, während die Fortschrittsinformationen weiterhin im Konsolenfenster angezeigt werden? Ich habe das Gefühl, dass die Antwort in verschiedene Streams in andere Streams umlenken, wie in diesem Post diskutiert , aber ich bin mir nicht wirklich sicher.

Irgendwelche Vorschläge werden geschätzt. Danke!

======== Aktualisierung =======

Ich bin mir nicht sicher, ob die git.exe anders ist als Ihre typische ausführbare Datei, aber ich habe noch mehr Tests gemacht und hier ist, was ich gefunden habe:

%Vor%

$ output enthält immer den Text "Cloning in '[localRepoDirectory]' ...", unabhängig davon, ob der Befehl erfolgreich ausgeführt wurde oder einen Fehler verursacht hat. Außerdem werden die Fortschrittsinformationen weiterhin in die Konsole geschrieben. Das führt mich zu der Annahme, dass die Fortschrittsinfo nicht über stdout, sondern über einen anderen Stream geschrieben wird?

Wenn ein Fehler auftritt, wird der Fehler in die Konsole geschrieben, jedoch in der üblichen weißen Vordergrundfarbe, nicht im typischen Rot für Fehler und gelb für Warnungen. Wenn dieser Aufruf innerhalb einer Cmdlet-Funktion erfolgt und der Befehl mit einem Fehler fehlschlägt, wird der Fehler NICHT über den Parameter -ErrorVariable (oder -WarningVariable) der Funktion zurückgegeben (wenn ich jedoch meinen eigenen Schreibfehler erstelle, der über -ErrorVariable zurückgegeben wird) ). Das führt mich zu der Annahme, dass git.exe nicht in Stderr schreibt, aber wenn wir tun:

%Vor%

Die Fehlermeldung wird in die Datei geschrieben, so dass ich denke, dass sie in stderr schreibt. So, jetzt bin ich verwirrt ...

======== Aktualisierung 2 =======

Also, mit Byrons Hilfe habe ich ein paar mehr Lösungen ausprobiert, die einen neuen Prozess verwenden, aber ich kann immer noch nicht bekommen, was ich will. Wenn ich einen neuen Prozess verwende, bekomme ich nie den schönen Fortschritt, der in die Konsole geschrieben wird.

Die drei neuen Methoden, die ich ausprobiert habe, verwenden beide diesen gemeinsamen Code:

%Vor%

Methode 1 - Führen Sie einen neuen Prozess aus und lesen Sie die Ausgabe nach:

%Vor%

Methode 2 - Ausgabe synchron erhalten:

%Vor%

Auch wenn dies so aussieht, als würde es die Ausgabe schreiben, während der Prozess läuft, schreibt es nichts, bis der Prozess beendet ist.

Methode 3 - Ausgabe asynchron abrufen:

%Vor%

Dies gibt Daten aus, während der Prozess läuft, was gut ist, aber immer noch nicht die nette Fortschrittsinformation anzeigt: (

    
deadlydog 09.05.2013, 17:28
quelle

3 Antworten

2

Ich denke, ich habe deine Antwort. Ich arbeite eine Zeit lang mit Powershell und habe mehrere Build-Systeme erstellt. Sorry, wenn das Skript ein bisschen lang ist, aber es funktioniert.

%Vor%

Die Protokolldatei muss im globalen Bereich sein, da die Routine, die die Ereignisverarbeitung ausführt, nicht im Skriptbereich enthalten ist.

Beispiel meiner Protokolldatei:

Out - Klonen in '' ... FEHLER - Auschecken von Dateien: 22% (666/2971)
FEHLER - Auschecken von Dateien: 23% (684/2971)
FEHLER - Auschecken von Dateien: 24% (714/2971)

    
romu 16.07.2013 10:15
quelle
1

Sie können dies tun, indem Sie den Befehl git clone in eine erweiterte Funktion einfügen, z. B .:

%Vor%     
Keith Hill 09.05.2013 23:35
quelle
0

Wenn Sie System.Diagnostics.Process verwenden, um git zu starten, können Sie alle Fehler umleiten und ausgeben.

Ich musste dieses Problem nur für Inkscape lösen

%Vor%

Sie können das natürlich in eine Funktion mit passenden Argumenten einfügen ...

    
Byron Ross 13.06.2013 06:15
quelle