我正在将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
任何帮助都会很明显。
答案 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.bat
或python.cmd
,因为在这种情况下,下一步line不会再执行,因为必须使用命令 CALL 从批处理文件中调用批处理文件,以便在完成被调用批处理文件的执行时返回调用批处理文件。
另请阅读Microsoft有关Using Command Redirection Operators的文章,了解>>
和2>>
的解释。