Wie erfasse ich die Ausgabe eines Skripts, wenn es vom Taskplaner ausgeführt wird?

93

Wie kann ich unter Windows Server 2008 die Ausgabe eines Skripts erfassen, das mit dem Windows-Taskplaner ausgeführt wird?

Ich teste ein ziemlich langes benutzerdefiniertes Druck-Batch-Skript und möchte zu Debugging-Zwecken jeden Abend die gesamte Ausgabe davon sehen.

Mechaflash
quelle
2
Manchmal funktioniert dies nicht, dh es wird keine Protokolldatei generiert. Ein Szenario, das dazu führen kann, ist, dass die Aufgabe überhaupt nicht gestartet wurde, weil Windows fälschlicherweise glaubt, dass sie noch ausgeführt wird. Sie können dies verfolgen, indem Sie sich den Aufgabenverlauf ansehen (Registerkarte Verlauf in der Aufgabeneigenschaft - es kann einige Sekunden dauern, bis die Informationen angezeigt werden)
Daniel,

Antworten:

82

Versuchen Sie dies als Befehlszeichenfolge im Taskplaner:

cmd /c yourscript.cmd > logall.txt
user2744787
quelle
2
nett, kein Wrapper erforderlich, funktioniert hervorragend und protokolliert auch die Ausgabe von untergeordneten Powershell-Skripten, die vom vom Taskplaner ausgelösten bat / cmd aufgerufen werden. Danke!
Jonesome Reinstate Monica
8
Verwenden cmd /c "path with spaces/command.cmd > file.txt"Sie diese Option zusätzlich, wenn Sie Leerzeichen haben. Die Antwort2>&1 von Ivan geht auch in die Zitate ein.
Dinei
3
Ich muss doppelte Anführungszeichen verwenden, um meine zum Laufen zu bringen: stackoverflow.com/a/6378038/1747983cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo
1
Ich weiß, dass es 5 Jahre her sind, aber dies in die akzeptierte Antwort zu ändern, um die minimalistische Art der Ausführung der Aufgabe zu sein.
Mechaflash
Jetzt wird beim Ausführen der Aufgabe ein Befehlsfenster angezeigt. Wie kann man das verhindern?
Chris
57

Mit stderr (wohin die meisten Fehler gehen):

cmd /c yourscript.cmd > logall.txt 2>&1
Ivan
quelle
56

Um die Antwort von @ user2744787 zu ergänzen, finden Sie hier einen Screenshot, der zeigt, wie cmdArgumente in einer geplanten Aufgabe verwendet werden:

Geplante Task-Cmd-Ausgabe in die Protokolldatei

Programm / Skript: cmd

Argumente hinzufügen: /c run_with_default_port.bat > IMQuantWebServices.log

Kevinarpe
quelle
5
Anscheinend starten Sie einen Dienst über eine geplante Aufgabe. Wenn dies ein Dienst sein soll, der dauerhaft im Hintergrund ausgeführt wird, schauen Sie sich alternativ NSSM an. Es führt jeden Befehl als Windows-Dienst aus und behandelt den Neustart nach einem Fehler usw.
Leemes
43

Das >>wird die Protokolldatei anhängen, anstatt sie jedes Mal zu überschreiben. Das 2>&1sendet auch Fehler an Ihre Protokolldatei.

cmd /c YourProgram.exe >> log.txt 2>&1
WhiteHotLoveTiger
quelle
39

Sie können eine debug.cmd haben, die Ihrecript.cmd aufruft

yourscript.cmd > logall.txt

Sie planen debug.cmd anstelle von yourscript.cmd

rene
quelle
10

Verwenden Sie den cmd.exeBefehlsprozessor, um einen Dateinamen mit Zeitstempel zu erstellen, um die Ausgabe Ihrer geplanten Aufgabe zu protokollieren

Um auf den Antworten anderer hier aufzubauen, möchten Sie möglicherweise eine Ausgabedatei erstellen, in die Datum und / oder Uhrzeit im Namen der Datei eingebettet sind. Sie können den cmd.exeBefehlsprozessor verwenden, um dies für Sie zu tun.

Hinweis: Diese Technik verwendet die Zeichenfolgenausgabe interner Windows-Umgebungsvariablen und schneidet sie basierend auf der Zeichenposition auf. Aus diesem Grund sind die genauen Werte in den folgenden Beispielen möglicherweise nicht für die von Ihnen verwendete Windows-Region korrekt. Bei einigen regionalen Einstellungen können einige Komponenten des Datums oder der Uhrzeit ein Leerzeichen in den erstellten Dateinamen einfügen, wenn ihr Wert kleiner als 10 ist. Um dieses Problem zu beheben, umgeben Sie Ihren Dateinamen mit Anführungszeichen, sodass unbeabsichtigte Leerzeichen in der Datei vorhanden sind Der Name wird die von Ihnen erstellte Befehlszeile nicht beschädigen. Experimentieren Sie und finden Sie heraus, was für Ihre Situation am besten geeignet ist.

Sei dir bewusst, dass PowerShelldas mächtiger ist als cmd.exe. Eine Möglichkeit, die leistungsfähiger ist, besteht darin, dass sie mit verschiedenen Windows-Regionen umgehen kann. Bei dieser Antwort geht es jedoch darum, dieses Problem cmd.exenicht zu lösen PowerShell, also fahren wir fort.

Verwenden von cmd.exe

Sie können auf verschiedene Komponenten von Datum und Uhrzeit zugreifen, indem Sie die internen Umgebungsvariablen aufteilen %date%und %time%wie folgt (die genauen Aufteilungswerte hängen wiederum von der in Windows konfigurierten Region ab):

  • Jahr (4 Ziffern): %date:~10,4%
  • Monat (2 Ziffern): %date:~4,2%
  • Tag (2 Ziffern): %date:~7,2%
  • Stunde (2 Ziffern): %time:~0,2%
  • Minute (2 Ziffern): %time:~3,2%
  • Zweitens (2 Ziffern): %time:~6,2%

Angenommen, Sie möchten, dass Ihre Protokolldatei in diesem Datums- / Zeitformat benannt wird: " Log_[yyyyMMdd]_[hhmmss].txt". Sie würden Folgendes verwenden:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

Führen Sie zum Testen die folgende Befehlszeile aus:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

Wenn Sie alles zusammenfügen, um beide stdoutund stderrIhr Skript in eine Protokolldatei mit dem aktuellen Datum und der aktuellen Uhrzeit umzuleiten , verwenden Sie möglicherweise Folgendes als Befehlszeile:

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

Beachten Sie die Verwendung von Anführungszeichen um den Dateinamen, um Instanzen zu behandeln, bei denen eine Datums- oder Zeitkomponente möglicherweise ein Leerzeichen einführt.

In meinem Fall würde die obige Befehlszeile Folgendes erzeugen, wenn das aktuelle Datum / die aktuelle Uhrzeit 10/05/2017 9:05:34 AM wäre:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
STLDev
quelle
Es gibt keine führende Null für Stunden unter 10: /
Ich bin
9

Sie können in die Zeilen, die Sie ausgeben möchten, wie folgt in eine Protokolldatei schreiben:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

Auf diese Weise können Sie auswählen, welche Befehle ausgegeben werden sollen, wenn Sie nicht alles durchsuchen möchten. Holen Sie sich einfach das, was Sie sehen müssen. Das >gibt es in die angegebene Datei aus (erstellt die Datei, wenn sie nicht vorhanden ist, und überschreibt sie, wenn dies der Fall ist). Das >>wird an die angegebene Datei angehängt (Erstellen der Datei, falls nicht vorhanden, aber an den Inhalt anhängen, falls vorhanden).

Bali C.
quelle
1

Beispiel zum Ausführen eines Programms und Schreiben von stdout und stderr in eine Datei mit Zeitstempel:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

Der Schlüssel besteht darin, den gesamten Teil dahinter doppelt zu zitieren cmd /cund darin wie gewohnt doppelte Anführungszeichen zu verwenden. Beachten Sie auch, dass das Datum vom Gebietsschema abhängig ist. In diesem Beispiel wird das US-Gebietsschema verwendet.

David Navrkal
quelle
0

Dieses Snippet verwendet wmic.exe, um die Datumszeichenfolge zu erstellen. Es wird nicht durch Gebietsschemaeinstellungen entstellt

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
Jim Birke
quelle