我使用 7-zip(在我的批处理文件中)打包某个目录并通过电子邮件发送存档。当我在批处理文件运行时同时使用此目录中的某个文件时(我使用任务计划程序启动批处理文件),我看到正在处理的警告消息。此后,当存档准备就绪时,7-zip 会在发送电子邮件之前显示如下消息:“警告:无法打开 29 个文件”。发生这种情况时,我希望能够设置一个环境变量(类似于%MESSAGE%
),其值为“正在进行 29 个警告”,并将此消息放在电子邮件的主题中。但是现在能做的就是使用变量%ERRORLEVEL%
。如果我无法设置变量%MESSAGE%
,是否可以将警告消息写入文件,然后解析此文件以提取最后一行?
答案1
我建议你使用7-Zip 命令行版本(7za.exe)。
以下命令将重定向全部输出(包括来自 stderr 的输出)到日志.txt:
7za a Test.7z *.* >Log.txt 2>&1
此外,7-Zip 返回以下退出代码,您可以在批处理文件中将其与 %ERRORLEVEL% 一起使用:
0 = 无错误。
1 = 警告(非致命错误)。例如,一个或多个文件被其他应用程序锁定,因此未压缩。
2 = 致命错误。
7 = 命令行错误。
8 = 内存不足,无法进行操作。
255 = 用户停止了该进程。
编辑:如果您不想要包含所有这些行的详细日志Compressing <filename>
,请改用以下命令:
7za a Test.7z *.* | findstr /i /v "pavlov scanning compressing" >Log.txt 2>&1
(带有上述开关的 findstr 命令将排除所有包含引号内的单词的行。)
答案2
7-Zip 写入全部将其消息发送到 stdout,包括错误和警告消息。这意味着您可以通过将 stdout 重定向到文件来收集所有输出。这可以通过在>output_filename
您传递给 7-Zip 的任何参数后附加到命令行来完成。例如:
7z args... >output_filename
之后,您应该能够解析输出文件并查找包含“WARNING”或其他内容的行。您可以根据 的值是否%ERRORLEVEL%
为非零(表示存在问题)或具体为 (1
表示存在非严重警告)有条件地执行此操作。
根据文档,这些是可能的退出代码(%ERRORLEVEL%
值):
代码含义
==== =======
0 无错误
1 警告(非致命错误)。例如,一个或多个文件被
其他应用程序锁定,因此未压缩。
2 致命错误
7 命令行错误
8 内存不足,无法进行操作
255 用户停止了该进程