PowerShell und Tee

9

Ich benutze diesen Befehl, um die Ausgabe sowohl in der Konsole als auch in einer Datei zu sehen:

powershell -command "my_command_1 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"  
powershell -command "my_command_2 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
# etc

Es funktioniert nicht so gut wie ich erwartet hatte und ich habe einige Fragen:

  1. Wie leite ich stderr auch in eine Datei um?
  2. Die Ausgabe funktioniert sehr seltsam. Bei einigen Befehlen gibt es eine große Verzögerung zwischen dem Drucken von Text und dem Aktualisieren der Konsole / Datei. Bei einigen anderen Befehlen scheint die Ausgabe beim Drucken von Text aktualisiert zu sein (ich führe Befehle ohne Abschlag aus und weiß, was gedruckt werden soll). Diese Verzögerung macht dieses T-Shirt fast unbrauchbar - was ist, wenn ein kritischer Fehler gedruckt wird, sodass ich den Befehl stoppen muss, aber nichts sehe, bis es zu spät ist?

    Bei einigen Befehlen wird die Ausgabe erst gedruckt, nachdem der vollständige Befehl ausgeführt wurde.

  3. Selbst wenn der Befehl nach Benutzereingaben fragt, ist die Konsolen- / Dateiausgabe leer! Für diesen Befehl weiß ich, was er erwartet und drucke blind benötigten Text und es hat funktioniert, aber für andere - ohne Ausgabe werde ich warten, bis etwas unendlich passiert, während der Befehl auf meine Eingabe wartet!

Gibt es Lösungen für diese Probleme? Wenn nicht, ist dieses Tee-Ding in PowerShell völlig nutzlos.

Rennen1
quelle
Ich zögere zu glauben, dass ein in Tausenden von Skripten verwendetes Tool "völlig nutzlos" ist, nur weil es möglicherweise nicht Ihren spezifischen Anforderungen entspricht.
Stephen Jennings
Richtig, ich meine, es ist in diesem speziellen Fall nutzlos :) Ich lasse das Tee lieber in Ruhe, als dass es so schlimme Probleme gibt.
Rennen1

Antworten:

7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Siehe Get-Help about_Redirection.
  2. Sie sollten Fehler einfangen und sich nicht auf Ctrl+ verlassen C. Siehe Get-Help about_Try_Catch_Finally. Ist der Befehl, den Sie ausführen, ein externes Programm oder ein Skript?
  3. So wie ich es verstehe, werden String-Objekte normalerweise erst dann über die Pipe gesendet, wenn ein Zeilenendezeichen erreicht ist. Der Grund ist ganz einfach: Wenn dies nicht der Fall wäre, würden teilweise (sprich: unvollständige) Zeichenfolgen die Pipe hinuntergehen. Teekönnte Teilzeichenfolgen gut verarbeiten, aber andere Cmdlets mögen ForEach-Objectoder Select-Objectwürden es sicherlich nicht. Beachten Sie, dass Get-Contentes einen speziellen Schalter gibt, -ReadCountder dieses Verhalten etwas außer Kraft setzt und einen Select-Object -Skip/-First/-Last/-UniqueBefehl weiter unten in der Pipe ernsthaft durcheinander bringt .

Es kann durchaus sein, dass externe Programme, die Sie ausführen, nicht den von PowerShell erwarteten Konventionen entsprechen. Teewird zum Beispiel richtig aufgerufen Tee-Object, was Ihnen sagen sollte, mit welchen Dingen es gut ist, zu arbeiten. In diesem Fall sind Sie möglicherweise weiter tee.exevon GNU Win32 Utils oder MSYS entfernt, die für die sofortige Weiterleitung von Inhalten ausgelegt sind.

Speckwürfel
quelle
1. Danke; 2. Richtig, ich meinte einige kritische unvorhergesehene Situationen; 3. Ich verstehe nicht, was für unvollständige Zeichenfolgen schuldig ist :) Schließlich führen meine Befehle Python-Skripte aus - es sind Fabric-Befehle. Ich habe versucht, tee.exe von für Windows kompilierten Linux-Utils zu verwenden - das gleiche Ergebnis, in einigen Fällen keine Ausgabe. Bedeutet das, dass meine konkrete Konfiguration und meine konkreten Skripte mit Tee-Dienstprogrammen überhaupt nicht gut funktionieren? Vielen Dank.
Rennen1
Das klingt für mich so, als ob sich das Python-Skript schlecht verhält.
Bacon Bits