批处理错误重定向到文件

时间:2017-12-26 08:10:42

标签: python batch-file error-handling

我正在将Python脚本的输出重定向到文件。 如果没有错误,它可以正常工作。 但是如果有任何错误,我希望在另一个现在没有发生的文件中捕获错误。

以下是我写的脚本。

@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

任何帮助都会很明显。

1 个答案:

答案 0 :(得分:1)

动态环境变量DATE的使用取决于为当前使用的用户帐户定义的Windows 区域设置。

例如,在同一窗口Tue 12/26/2017中运行时,将echo %DATE%写入命令提示符窗口,可以使用

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

或更好

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

两个命令行都使用字符串替换来获取使用字符串dt定义的环境变量2017-12-26。区别在于第一个命令行引用了左边的日期字符串中的字符,而第二个命令行从右边引用了它们。因此,第二个命令行在开始时也没有缩写的工作日。

命令提示符窗口中运行set /?时命令 SET 的帮助输出解释了此处使用的字符串替换。

以格式YYYY-MM-DD获取当前本地日期的区域无关解决方案将是:

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%"

这个变体在%date% produces different result in batch file when run from Scheduled Tasks in Server 2016的答案中有详细解释。

缺点是 WMIC 需要一秒多的时间来输出本地日期和时间,这使得此解决方案比使用动态环境变量DATE的解决方案慢得多。

我建议使用:

@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

Python 命令行中有一个尾随空格,在上面的代码中删除了该空格。请参阅Why does ECHO command print some extra trailing space into the file?
的答案 Why is no string output with 'echo %var%' after using 'set var = text' on command line?为什么批处理文件中的尾随空格可能导致文件意外输出,甚至导致批处理文件执行时出现意外行为。

python扩展了文件扩展名.exe,以避免偶然发现Windows命令解释程序首先找到文件python.batpython.cmd,因为在这种情况下,下一步line不会再执行,因为必须使用命令 CALL 从批处理文件中调用批处理文件,以便在完成被调用批处理文件的执行时返回调用批处理文件。

另请阅读Microsoft有关Using Command Redirection Operators的文章,了解>>2>>的解释。