Erzwingen Sie die Ausgabe in einem Batch-Skript zur Konsole, wobei die Ausgabe in eine Datei umgeleitet wird

481
Firstrock

Ich habe eine Batch-Datei, die unter anderem die Umgebung einrichtet und einen Build ausführt. Sowohl stdout (Skriptausgabe) als auch stderr (Compilerfehler) werden in separate Dateien umgeleitet. Ist es möglich, dass eine Batchdatei die Ausgabe eines bestimmten Befehls zwangsweise an die Konsole sendet, unabhängig von der Umleitung der Batchdatei?

Dies könnte eine wichtige Nachricht sein, die nicht umgeleitet werden sollte. Oder genauer gesagt, um einen colorBefehl in das Skript zu setzen, um die Vordergrund- und Hintergrundfarben der Konsole festzulegen, um mich darauf hinzuweisen, dass die Konsole nicht für andere Zwecke verwendet werden darf (weil die Umgebung geändert wurde). Wenn stdout umgeleitet wird, colorwerden die Konsolenfarben nicht geändert.

0
Verwenden Sie Powershell für solche Aufgaben https://superuser.com/a/74128/164837 Alex vor 5 Jahren 0
Umleitung auf Gerät `> CON:` LotPings vor 5 Jahren 0

2 Antworten auf die Frage

2
LotPings

Um meinen Kommentar zu demonstrieren:

:: Q:\Test\2018\08\10\SU_1347898.cmd @Echo off cls ( Echo normal output 1 redirected with the code block net file returns an error Echo *** this line should go directly to Console *** >CON: Echo normal output 2 redirected with the code block ) 1>SU_1347898_.txt 2>SU_1347898_Error.log echo( findstr "^" %~n0_* 

Beispielausgabe:

*** this line should go directly to Console ***  SU_1347898_Error.log:Die Syntax dieses Befehls lautet: SU_1347898_Error.log: SU_1347898_Error.log:NET FILE SU_1347898_Error.log:[id [/CLOSE]] SU_1347898_Error.log: SU_1347898_.txt:normal output 1 redirected with the code block SU_1347898_.txt:normal output 2 redirected with the code block 
2
dbenham

Wie LotPings in seinem Kommentar und seiner Antwort sagt, können Sie die Ausgabe immer direkt über die Konsole steuern >con(Hinweis: Das Nachlaufen :wird nicht benötigt).

Aber nicht alle Funktionen funktionieren einwandfrei, wenn Sie dazu aufgefordert werden con. Zum Beispiel wird clsder Bildschirm nicht richtig gelöscht.

Eine andere Option besteht darin, eine Kopie des ursprünglichen stdout zu speichern, bevor Sie in eine Datei umgeleitet werden, und dann die speziellen Befehle an das gespeicherte Handle weiterleiten.

@echo off 9>&1 1>stdout.txt 2>stderr.txt ( echo Most output goes to a file echo Hello world >&9 echo But this goes to the original definition of stdout - the console ) 

Beachten Sie, dass jedes Mal, wenn Sie ein vorhandenes Handle umleiten, die ursprüngliche Definition im ersten verfügbaren undefinierten Handle gespeichert wird, bevor die Umleitung ausgeführt wird. Angenommen, es gab keine vorherige Umleitung, dann zeigt & 3 unten auf das Original stdout (Konsole), sodass keine explizite Speicherung auf 9 erforderlich ist.

@echo off 1>stdout.txt 2>stderr.txt ( echo Most output goes to a file echo Hello world >&3 echo But this normally goes to the original definition of stdout - the console ) 

Ich möchte mich jedoch nicht auf das implizite Speichern verlassen, da ich nicht garantieren kann, dass 3 noch nicht verwendet wurde. Daher kann ich nicht das korrekte Ergebnis erhalten. Speichern Sie am besten explizit in einem von Ihnen angegebenen nicht verwendeten Handle.