PowerShell Tee-Fragen

4605
race1

Ich verwende diesen Befehl, um die Ausgabe sowohl auf der Konsole als auch in der Datei anzuzeigen:

powershell -command "my_command_1 | tee ('logs\.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"  powershell -command "my_command_2 | tee ('logs\.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 stderr auch zur Datei umleiten?
  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 aktualisiert zu sein, wenn Text gedruckt wird (Ich führe Befehle ohne Tee aus und weiß, was gedruckt werden soll). Diese Verzögerung macht dieses T-Shirt fast unbrauchbar - was passiert, wenn ein kritischer Fehler gedruckt wird, muss ich den Befehl stoppen, aber ich sehe nichts, bis es zu spät ist. Bei einigen Befehlen wird die Ausgabe nur gedruckt, nachdem der vollständige Befehl ausgeführt wurde.
  3. Auch wenn der Befehl fragt, ob die Benutzereingabekonsole / -ausgabe leer ist! Für diesen Befehl weiß ich, was erwartet wird, und druckt den benötigten Text blind aus, und es hat funktioniert, aber für andere - ohne Ausgabe warte ich, dass etwas unendlich passiert, während der Befehl auf meine Eingabe wartet!

Gibt es Lösungen für diese Probleme? Wenn nicht, ist dieses T-Stück in Powershell völlig nutzlos.

8
Ich zögere zu glauben, dass ein Werkzeug, das in Tausenden von Skripts verwendet wird, "völlig unbrauchbar" ist, nur weil es möglicherweise nicht Ihren spezifischen Anforderungen entspricht. Stephen Jennings vor 13 Jahren 0
Richtig, ich meine, es ist in diesem speziellen Fall nutzlos :) Ich lasse das T-Stück lieber in Ruhe, als solche schlechten Probleme. race1 vor 13 Jahren 0

1 Antwort auf die Frage

6
Bacon Bits
  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. Wird mit dem Befehl ein externes Programm oder ein Skript ausgeführt?
  3. Wie ich es verstehe, werden String-Objekte normalerweise nicht über die Pipe gesendet, bis ein Zeilenende-Zeichen erreicht ist. Der Grund ist ziemlich einfach: Wenn dies nicht der Fall wäre, würden unvollständige Zeichenketten (gelesen: unvollständig) die Pipe durchgehen. TeeMit Teilstrings kann man zwar gut umgehen, andere Cmdlets dagegen mögen ForEach-Objectoder werden es Select-Objectbestimmt nicht. Beachten Sie, dass Get-Contentes einen speziellen Schalter gibt, -ReadCountder dieses Verhalten etwas außer Kraft setzt, und es wird ernsthaft mit einem Select-Object -Skip/-First/-Last/-UniqueBefehl in der Pipe verwirrt .

Es kann sehr gut sein, dass externe Programme, die Sie ausführen, nicht den Konventionen entsprechen, die PowerShell erwartet. Teezum Beispiel wird richtig aufgerufen Tee-Object, was Ihnen sagen sollte, mit welchen Dingen es gut ist, damit zu arbeiten. In diesem Fall sind Sie möglicherweise weiter auf der Linie tee.exevon GNU Win32 Utils oder MSYS, die für die sofortige Weiterleitung von Inhalten gedacht sind.

1. danke 2. Richtig, ich meinte einige unvorhergesehene Situationen; 3. Ich verstehe nicht, was für unvollständige Zeichenfolgen schuldig ist :) Schließlich führen meine Befehle Python-Skripts aus - es sind Fabric-Befehle. Ich habe versucht, tee.exe von für Windows kompilierten Linux-Utils zu verwenden - dasselbe Ergebnis, in manchen Fällen keine Ausgabe. Bedeutet das, dass meine konkrete Konfiguration und meine konkreten Skripts überhaupt nicht mit Tee-Dienstprogrammen funktionieren? Vielen Dank. race1 vor 13 Jahren 0
Das hört sich für mich so an, als würde sich das Python-Skript schlecht benehmen. Bacon Bits vor 13 Jahren 0
Traurige Nachrichten. Vielen Dank für die ausführliche Antwort. race1 vor 13 Jahren 0