Ausgabe der Befehlszeile zeilenweise in Windows

371
Kidburla

Ich verwende einen Server mit einer Batchdatei und möchte, dass die Serverausgabe sowohl auf dem Bildschirm angezeigt als auch in eine Protokolldatei geschrieben wird. Ich habe aus dieser Antwort einen Weg gefunden :

powershell "startmyserver | tee server.log"

Das Problem ist, dass die Pipe bewirkt, dass der erste Befehl ausgeführt und vollständig abgeschlossen ist, bevor der zweite Befehl ausgeführt wird. Dies bedeutet, dass ich den Standardwert meines Servers nicht überwachen kann, während er tatsächlich ausgeführt wird. Dies ist das, was ich versuche zu tun (ich möchte den Server nicht herunterfahren, nur um die neuesten Protokollmeldungen zu überprüfen).

Für ein einfacheres Beispiel habe ich versucht pause. Nun, pauseauf Powershell existiert es nicht, also musste ich es in einer verschachtelten cmdShell ausführen :

powershell "cmd /c pause | tee test.txt"

Es überrascht nicht, dass ich nach dem Ausführen dieses Befehls nur einen blinkenden Cursor bekomme. Nach einer Weile drücke ich eine Taste, und dann wird "Drücken Sie eine beliebige Taste, um fortzufahren" angezeigt, und es wird fast gleichzeitig in die Datei geschrieben.

Was ich tun möchte, ist die Pipe, um die Standardoption Zeile für Zeile zum nächsten Befehl zu streamen. Mit anderen Worten, jedes Mal, wenn es auf ein EOL-Zeichen trifft, sollte es eine Ausgabe senden, und dies sollte (in meinem Fall tee) bewirken, dass der Text auf dem Bildschirm erscheint und gleichzeitig in die Datei geschrieben wird. (Ich mache mir sogar keine Gedanken darüber, ob der Text zeilenweise in die Datei geschrieben wird, er könnte am Ende alles geschrieben werden, auch wenn das nicht ideal wäre. Ich möchte nur die Zeilen sehen können auf dem Bildschirm, wie sie geschrieben werden.)

Ist dies in der Eingabeaufforderung und / oder der Powershell möglich?

2
@PimpJuiceIT Ich denke, es spielt eine Rolle bei den Anführungszeichen. Wenn Sie Powershell-Cmd / c ausführen, pause | tee "test.txt" `Sie führen tee in Ihrem aktuellen Kontext aus. Ich führe dies von cmd aus (nicht von ps1), so dass dieser Befehl fehlschlägt, da "tee" ein Powershell-Befehl ist. Wenn dieser Befehl für Sie funktioniert hat, gehe ich davon aus, dass (a) Sie einen anderen Abschlag in Ihrem System haben oder (b) Sie dies in Powershell ausgeführt haben. Keiner davon ist mein Anwendungsfall. Kidburla vor 5 Jahren 0
@PimpJuiceIT Hast du ein anderes Beispiel für einen Befehl, den ich anstelle von "Pause" verwenden könnte? Ich habe "pause" nur aus Gründen der Bequemlichkeit verwendet, weil ich keinen Befehl wollte, der sofort abgebrochen würde und es daher unmöglich ist zu erkennen, ob die Zeilen gestreamt wurden, bevor der Befehl ausgeführt wurde Kidburla vor 5 Jahren 0
Vielleicht schlafen Sie vielleicht, aber es scheint, dass Sie eine funktionierende Lösung gefunden haben. Pimp Juice IT vor 5 Jahren 0

1 Antwort auf die Frage

1
harrymc

Dieses Problem wird bei Stack Overflow als die Tatsache erklärt, dass die PowerShell Tee-Objectden Ausgabestrom nicht leert, sondern nur darauf wartet, dass die Quelle dies tut, sodass Sie die Ausgabe am Ende der Operation erhalten. Dies ist beabsichtigt.

Die in der Antwort vorgeschlagene Problemumgehung bestand in der Verwendung dieses Codes:

./program | ForEach-Object { Write-Host $_ $_ } | Set-Content program.log 

Eine alternative Formulierung, um zu versuchen, ob die obige nicht funktioniert hat, ist:

./program | ForEach-Object { [Console]::WriteLine($_) [Console]::Out.Flush() $_ } | Set-Content program.log 

Der Befehl würde also so aussehen:

PowerShell -ExecutionPolicy Unrestricted "startmyserver | ForEach-Object { Write-Host $_; $_} | Set-Content server.log" 

In meinen bescheidenen Tests wurde die Ausgabe zu schnell generiert, um zu sehen, ob dies wie von Ihnen angegeben funktioniert.

Vielen Dank! Haben Sie eine Idee, wie Sie (a) sowohl stdout als auch stderr schreiben, (b) an eine bereits vorhandene Datei anhängen können, anstatt eine neue zu erstellen? Kidburla vor 5 Jahren 0
Siehe [diesen Beitrag] (https://superuser.com/questions/273104/powershell-tee-questions). harrymc vor 5 Jahren 1
Vielen Dank und ich konnte Teil (b) mithilfe von "Add-Content" anstelle von "Set-Content" auflösen Kidburla vor 5 Jahren 0