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


5

我使用7-zip(在我的批处理文件中)打包一些目录并通过电子邮件发送存档。当我在批处理文件运行的同时在此目录中使用某个文件时(我使用任务计划程序启动批处理文件),我看到正在处理的警告消息。在此之后,当存档准备就绪时,7-zip会在发送电子邮件之前显示如下消息:“警告:无法打开29个文件”。当发生这种情况时,我希望能够设置一个环境变量(类似于 %MESSAGE% )使用值“29警告正在进行中”并将此消息放入电子邮件的主题中。但现在所能做的就是使用 %ERRORLEVEL% 变量。如果我不能设置一个 %MESSAGE% 变量,是否可以将警告消息写入文件,然后解析此文件以提取最后一行?

Answers:


6

我建议你用 7-Zip命令行版本 (7za.exe)。

像下面这样的命令将重定向 所有 输出(包括从stderr)到 log.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命令会排除包含引号内单词的所有行。)


谢谢,%errorlevel%不是我需要的那么灵活,但是 >xxx.log 2>&1 是我几乎需要的。几乎 - 因为日志文件太大了...我的档案中有这么多文件,超过100k ......但这是个好主意,我 ll trying to use it for brainstorm tomorrow =) can you spell out what is it - 2&gt;&amp; 1`我不喜欢 t understand it fully? how it work? by the way, i m使用7z.exe而不是7za,但没关系,我看这些程序没有区别
slesar.mira

>Log.txt 2>&1 将标准输出(= 1)和标准错误(= 2)流重定向到Log.txt(参见 这里 更多)。此外,我猜你也可以使用7z.exe,只是我更喜欢7za.exe,因为我纯粹是从命令行使用它。
Karan

1
我不认为7-zip会给stderr写任何东西。
martineau

链接 , 再次感谢你! =)
slesar.mira

@martineau:也许没有,但是额外的2&gt;&amp; 1将确保捕获的任何指示。即使应用程序通常不写入stderr也没有任何损害,即使应用程序通常不写入stderr(也是,为什么不呢?IMO它 应该 直接错误到stderr而不是stdout)。
Karan

1

7-Zip写道 所有 它给stdout的消息,包括错误和警告消息。这意味着您可以通过将stdout重定向到文件来收集它的所有输出。这可以通过附加来完成 >output_filename 在你传递给7-Zip的任何参数之后的命令行。例如:

7z args... >output_filename

之后,您应该能够解析输出文件并查找包含“WARNING”或其中任何内容的行。您可以根据是否有条件地执行此操作 %ERRORLEVEL% 非零,表示存在一些问题,或者特别是存在问题 1 这意味着有非致命的警告。

根据文件,这些是可能的退出代码( %ERRORLEVEL% 值):

代码含义
==== =======
0没有错误
1警告(非致命错误)。例如,一个或多个文件被锁定
其他一些应用程序,因此它们没有被压缩。
2致命错误
7命令行错误
8操作内存不足
255用户停止了该过程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.