Ausgabe aus der Batch-Datei umleiten

110

Ich erstelle eine Batch-Datei mit einigen einfachen Befehlen, um Informationen von einem System zu sammeln. Die Batch-Datei enthält Befehle zum Abrufen der Uhrzeit, IP-Informationen, Benutzer usw.

Ich habe alle Befehle in einer Batchdatei zusammengestellt und sie wird ausgeführt, aber ich möchte, dass die Batchdatei beim Ausführen die Ergebnisse in eine Textdatei (Protokoll) ausgibt. Gibt es einen Befehl, den ich dem Stapel hinzufügen kann, der dies tun würde?

Denken Sie daran, dass ich den Stapel nicht über cmd ausführen und dann die Ausgabe umleiten möchte. Ich möchte die Ausgabe aus dem Stapel heraus umleiten, wenn dies möglich ist.

user3085030
quelle

Antworten:

161

Der einfache naive Weg, der langsam ist, weil er den Dateizeiger mehrmals öffnet und auf das Dateiende positioniert.

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

Ein besserer Weg - einfacher zu schreiben und schneller, da die Datei nur einmal geöffnet und positioniert wird.

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

Ein weiterer guter und schneller Weg, der die Datei nur einmal öffnet und positioniert

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN

Bearbeiten Sie 2020-04-17

Von Zeit zu Zeit möchten Sie möglicherweise wiederholt in zwei oder mehr Dateien schreiben. Möglicherweise möchten Sie auch andere Nachrichten auf dem Bildschirm anzeigen. Es ist weiterhin möglich, dies effizient zu tun, indem Sie zu undefinierten Handles außerhalb eines Blocks oder einer Unterroutine in Klammern umleiten und dann die &Notation verwenden, um auf die bereits geöffneten Dateien zu verweisen.

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b

Ich habe mich für die Verwendung der Handles 9 und 8 in umgekehrter Reihenfolge entschieden, da auf diese Weise eine potenzielle dauerhafte Umleitung aufgrund eines Konstruktionsfehlers bei der Implementierung der Microsoft-Umleitung eher vermieden wird, wenn mehrere Umleitungen mit demselben Befehl ausgeführt werden. Es ist höchst unwahrscheinlich, aber selbst dieser Ansatz könnte den Fehler aufdecken, wenn Sie sich genug anstrengen. Wenn Sie die Umleitung durchführen, wird das Problem garantiert vermieden.

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.
Dbenham
quelle
2
Ich liebe die Lösungen, bei denen ich sie für den Rest der Datei
Sam
3
Beachten Sie, dass die Anruflösung Ihre % 0 ( in diesem Fall in sub ) ändert, was möglicherweise Ihren Wünschen entspricht oder nicht.
Jannes
1
@Jannes - Stimmt, aber Sie können immer Informationen über das laufende Batch-Skript erhalten, wenn Sie einen Modifikator hinzufügen. %~f0Gibt beispielsweise immer den vollständigen Pfad zum Batch-Skript an, auch wenn Sie sich in einer CALLed: -Unterroutine befinden.
Dbenham
3
@ ThariqNugrohotomo ->output.txt 2>&1
Dbenham
2
@Moondra - das ist die Standard-Batch-Syntax zum Aufrufen einer beschrifteten Unterroutine innerhalb desselben Skripts. Ausführen cmd /?oder help cmdüber die Konsolenbefehlszeile zur Dokumentation. Der Trick der dritten Methode besteht darin, dass die Umleitung auf dem CALL für alle Befehle innerhalb der CALLed-Subroutine gilt.
Dbenham
66

Wenn Sie möchten, dass sowohl Out- als auch Err-Streams umgeleitet werden

dir >> a.txt 2>&1
Kalpesh Soni
quelle
27
+1. Es ist auch erwähnenswert, dass die Verwendung >>an angehängt wird a.txt. a.txtVerwenden Sie zum Überschreiben stattdessen >. stackoverflow.com/q/4458231/1098302
Aaron
Hallo, gibt es eine Möglichkeit, die Ausgabe auch auf der Konsole umzuleiten?
Sandeep Singh
das ist was es tut
Kalpesh Soni
16

Ich weiß, dass dies ein älterer Beitrag ist, aber jemand wird in einer Google-Suche darauf stoßen und es sieht auch so aus, als ob einige Fragen, die das OP in Kommentaren gestellt hat, nicht speziell angesprochen wurden. Bitte schonen Sie mich auch, da dies meine erste Antwort auf SO ist. :) :)

Um die Ausgabe unter Verwendung eines dynamisch generierten Dateinamens in eine Datei umzuleiten, ist mein Go-to-Ansatz (sprich: schnell und schmutzig) die zweite von @dbenham angebotene Lösung. So zum Beispiel:

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

Erstellt eine Datei wie in diesem Screenshot der Datei im Zielverzeichnis

Das wird diese Ausgabe enthalten:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

Denken Sie auch daran, dass diese Lösung vom Gebietsschema abhängig ist. Seien Sie also vorsichtig, wie / wann Sie sie verwenden.

Anthony
quelle
Danke, das war nützlich. Kurze Frage: Gibt es einen Grund, warum Sie .log vs .txt verwenden? Macht das einen Unterschied?
Moondra
1
@ Moondra nein, tut es nicht. In diesem Fall ist es nur Semantik. Das heißt nicht, dass es keine Anwendungen gibt, die / grep basierend auf dem Dateityp benötigen. Achten Sie also darauf, ob / wie Ihre Dateien verwendet werden.
Anthony
9
echo some output >"your logfile"

oder

(
 echo some output
 echo more output
)>"Your logfile"

sollte die Rechnung füllen.

Wenn Sie APPENDdie Ausgabe möchten , verwenden Sie >>anstelle von >. >startet eine neue Protokolldatei.

Magoo
quelle
9
@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause
saif
quelle
Ich denke, dass dies der eleganteste Weg ist. Danke Wesley!
Kiswanij
5

Es gibt ein cooles kleines Programm, mit dem Sie die Ausgabe in eine Datei und die Konsole umleiten können

some_command  ^|  TEE.BAT  [ -a ]  filename 

AquaAlex
quelle
3
@echo OFF
[your command] >> [Your log file name].txt

Ich habe den obigen Befehl in meiner Batch-Datei verwendet und er funktioniert. In der Protokolldatei werden die Ergebnisse meines Befehls angezeigt.

Indra Permana
quelle
3

Fügen Sie diese beiden Zeilen oben in Ihrer Batch-Datei hinzu. Alle stdout und stderr after werden in log.txt umgeleitet:

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1
ilgitano
quelle
Das hat bei mir funktioniert, danke. Gibt es spezielle Überlegungen, bei denen dies fehlschlagen kann? (zB Überlauf der Ausgabegröße)
CCarlos
Hallo, danke für deine Antwort! Gibt es eine Möglichkeit, es auch auf der Konsole umzuleiten?
Sandeep Singh
0

Dies kann bei "toxischen" Zeichen in der Eingabe fehlschlagen. Wenn Sie eine Eingabe wie diese berücksichtigen, ist isAnIn ^^^^ put ein guter Weg, um zu verstehen, was los ist. Sicher gibt es eine Regel, dass eine Eingabezeichenfolge in doppelten Anführungszeichen stehen muss, aber ich habe das Gefühl, dass diese Regel nur dann eine gültige Regel ist, wenn die Bedeutung der Eingabe ein Speicherort auf einer NTFS-Partition ist (möglicherweise ist es eine Regel für URLs I. bin nicht sicher). Aber es ist natürlich keine Regel für eine beliebige Eingabezeichenfolge (es ist "eine gute Praxis", aber Sie können nicht damit rechnen).

Jan Antonin
quelle
0

Wenn Sie die folgenden Zeilen am Ende Ihrer Batch-Datei hinzufügen, wird alles so erfasst, wie es im CMD-Fenster angezeigt wird, und in eine Textdatei exportiert:

powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^a')
powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^c')
powershell Get-Clipboard > MyLog.txt

Grundsätzlich wird eine Auswahl aller -> In Zwischenablage kopieren -> In Textdatei einfügen ausgeführt .

GioVi
quelle