2017-12-26 14 views
1

Ich umadressiere die Ausgabe eines Python-Skripts in eine Datei. Es funktioniert gut, wenn kein Fehler vorliegt. Aber wenn es einen Fehler gibt, möchte ich den Fehler in einer anderen Datei erfassen, die jetzt nicht passiert.Stapelfehler, der in Datei umleitet

Unten ist das Skript, das ich geschrieben habe.

@echo off 
mode con cp select=65001 
set dt=%Date:~10,4%-%Date:~4,2%-%Date:~7,2% 

cd C:\API_DOC\softeon_project\script 
python -u softeon_main.py >>C:\API_DOC\softeon_project\log\log_%dt%.txt 2>>C:\API_DOC\softeon_project\log\logerr_%dt%.txt 
echo "after python path" 
pause 
exit 

Jede Hilfe wäre nennenswert.

+0

'python test.py> log.log 2> err.log' funktioniert für mich auf ubuntu. Vielleicht funktioniert es nicht unter Windows? – Sraw

+0

Ich habe es in Windows versucht es funktioniert. Vielleicht sollten Sie den Code zuerst ohne Ausgabeumleitung ausführen und prüfen, ob ein Fehler angezeigt wird oder nicht. –

+0

@Sraw: Ja, es funktioniert nicht auf Windows 10. Ich habe die richtige Ordnerstruktur. –

Antwort

1

Die Verwendung der dynamischen Umgebungsvariablen DATE ist abhängig von Windows Region Einstellung wie für das derzeit verwendete Benutzerkonto definiert.

Zum Beispiel mit immer Tue 12/26/2017 in ein Eingabeaufforderungsfenster geschrieben in demselben Fenster läuft echo %DATE% ist es möglich, entweder

set "dt=%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%" 

oder besser

set "dt=%DATE:~-4%-%DATE:~-10,2%-%DATE:~-7,2%" 

Beiden Befehlszeilen verwenden Substitutionen Zeichenfolge zu verwenden, um Get Umgebungsvariable dt definiert mit Zeichenfolge 2017-12-26. Der Unterschied besteht darin, dass die erste Befehlszeile die Zeichen in der Datumszeichenfolge von links referenziert, während die zweite Befehlszeile sie von rechts referenziert. Daher funktioniert die zweite Befehlszeile auch ohne abgekürzten Wochentag am Anfang.

Die Hilfeausgabe für den Befehl SET beim Ausführen von set /? in einem Eingabeaufforderungsfenster erklärt String-Substitutionen wie hier verwendet.

Eine unabhängige Region Lösung aktuelles Datum im Format zu erhalten YYYY-MM-DD wäre:

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "dt=%%I" 
set "dt=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%" 

Diese Variante ist im Detail in Antwort auf %date% produces different result in batch file when run from Scheduled Tasks in Server 2016 erläutert.

Der Nachteil ist, dass WMIC mehr als eine Sekunde dauert das lokale Datum und die Zeit zur Ausgabe, die diese Lösung viel langsamer als die Lösung mit dynamischer Umgebungsvariable DATE macht.

Ich schlage vor, zu verwenden:

@echo off 
rem Define encoding UTF-8 for console. 
%SystemRoot%\System32\mode.com CON CP SELECT=65001 

rem Get current local date in format YYYY-MM-DD. 
set "dt=%DATE:~-4%-%DATE:~-10,2%-%DATE:~-7,2%" 

rem Change the current directory independent on current drive. 
cd /D C:\API_DOC\softeon_project\script 

rem Execute Python interpreter and redirect standard output messages 
rem to file log_%dt%.txt and error messages to logerr_%dt%.txt. 
python.exe -u softeon_main.py >>C:\API_DOC\softeon_project\log\log_%dt%.txt 2>>C:\API_DOC\softeon_project\log\logerr_%dt%.txt 

echo "After python path" 
pause 

Es gibt einen hinteren Raum in Python Befehlszeile war, die oben im Code entfernt wird. Sehen Sie sich die Antworten auf Why does ECHO command print some extra trailing space into the file? und
Why is no string output with 'echo %var%' after using 'set var = text' on command line?, warum ein nachstehendes Leerzeichen in einer Batch-Datei zu einer unerwarteten Ausgabe in eine Datei oder sogar unerwartetes Verhalten bei der Ausführung einer Batch-Datei führen könnte.

Und python wurde mit der Dateierweiterung erweitert .exe zu vermeiden, dass eine Datei python.bat oder python.cmd zufällig, wie in diesem Fall zuerst von Windows-Befehlsinterpreter gefunden wird die nächste Zeile nicht mehr ausgeführt werden würde, da Batch-Dateien müssen aus einem heißen Stapeldatei mit Befehl CALL, um nach Beendigung der Ausführung der aufgerufenen Stapeldatei zur aufrufenden Stapeldatei zurückzukehren.

Lesen Sie auch den Microsoft-Artikel über Using Command Redirection Operators für eine Erklärung von >> und 2>>.

+0

Vielen Dank für die Antwort. Sehr selbsterklärend. –