如何在变量中(或者在文本文件中)写入命令行 7-zip 的错误状态

如何在变量中(或者在文本文件中)写入命令行 7-zip 的错误状态

我使用 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 用户停止了该进程

相关内容