python - 批量错误重定向到文件

标签 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

任何帮助都将不胜感激。

最佳答案

动态环境变量 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%"

这个变体在 Why does %date% produce a different result in batch file executed as scheduled task? 的回答中有详细解释

缺点是 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,因为在这种情况下下一行将不再执行,因为批处理文件必须从批处理中调用使用命令 CALL 调用文件以在完成调用的批处理文件的执行后返回到调用批处理文件。

另请阅读有关 Using command redirection operators 的 Microsoft 文章,了解 >>2>> 的解释。

关于python - 批量错误重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47975705/

相关文章:

android - 在覆盖DefaultUncaughtExceptionHandler的同时,我还能在市场上获得错误报告吗?

python - 使用 tensorflow 的多变量线性回归

python - 一个项目的 Django 多重身份验证后端

python - 哪个 itertools 生成器不会跳过任何组合?

windows - 为什么 "start firefox"命令在 Windows 命令提示符下有效?

java - 如何捕获 'Unsupported major.minor version'错误?

python - 如何找到被分水岭分割的区域的中心点?

visual-studio-2010 - Visual Studio 预生成事件 : Batch File Exit Code is -1

string - 通过批处理文件删除txt文件中的某些行

python - 如何修复Python Neat Openai Retro中的配置错误