我想在 Python 脚本中提取7-Zip存档。它工作正常,只是它会吐出提取细节(在我的情况下这是巨大的)。
有没有办法在提取时避免这种冗长的信息?我没有找到任何“静默”命令行选项7z.exe
。
我的命令是
7z.exe -o some_dir x some_archive.7z
我只是在搜索时遇到了这个问题,但我自己解决了!假设该命令是使用 Windows / DOS 处理的,一个更简单的解决方案是将您的命令更改为:
7z.exe -o some_dir x some_archive.7z > nul
也就是说,将输出定向到空文件而不是屏幕。
或者您可以将输出通过管道传送到 DOS“查找”命令以仅输出特定数据,即
7z.exe -o some_dir x some_archive.7z | FIND "ing archive"
这只会导致以下输出。
创建存档 some_archive.7z
或者
更新档案 some_archive.7z**
我的最终解决方案是将命令更改为
... some_archive.7z | FIND /V "ing "
注意“ing”后的双空格。这导致了以下输出。
7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Scanning
Updating some_archive.7z
Everything is Ok
这将删除单个文件处理,但会生成整体操作的摘要,而不管操作类型如何。
一种可能性是使用 生成子进程popen
,因此其输出将返回到父进程以进行处理/显示(如果需要)或完全忽略(使用创建popen
对象stdout=PIPE
并stderr=PIPE
能够从子进程检索输出) .
就像他们说的那样,要隐藏您可以使用的大多数屏幕填充消息... some_archive.7z | FIND /V “正在压缩”,但“FIND”也会删除包含该词的错误消息。你不会被警告。由于更新的 7-zip 版本,该“查找”也可能必须更改。
7-zip 具有强制详细输出、无静默模式、混合 stderr 和 stdout(*)、不保存 Unix 权限等。这些反标准行为一起使“7-zip”与例如,“tar+bzip2”或“zip”。
(*)“上游(伊戈尔巴甫洛夫)不想为消息做出不同的输出,即使他被多次要求这样做:(” http://us.generation-nt.com/answer/bug-346463- p7zip-stdout-stderr-help-166693561.html - “Igor Pavlov 不想改变这种行为” http://sourceforge.net/tracker/?func=detail&aid=1075294&group_id=111810&atid=660493
7zip 没有用于命令行提取的显式“安静”或“静默”模式。
一种可能性是使用 popen 生成子进程,因此它的输出将返回到父进程以进行处理/显示(如果需要)或完全忽略(使用 stdout=PIPE 和 stderr=PIPE 创建您的 popen 对象能够从孩子那里检索输出)。
否则尝试这样做:
%COMSPEC% /c "%ProgramFiles%\7-Zip\7z.exe" ...
扩展@Matthew 的答案和这个答案https://superuser.com/questions/194659/how-to-disable-the-output-of-7-zip 我使用 FINDSTR 而不是 find 所以我可以链接多个要排除的行和空白行:
7za.exe a test1.zip .\foldertozip | FINDSTR /V /R /C:"^Compressing " /C:"Igor Pavlov" /C:"^Scanning$" /C:"^$" /C:"^Everything is Ok$"
我正在使用 /C 以便空格是空格,否则它是要排除的多个单词之间的分隔符,就像在这个更简单的版本中一样:
FINDSTR /V "Compressing Pavlov Scanning Everytyhing"
(同样的警告存在,如果新版本中的措辞发生变化,或者如果有用的行以“压缩”一词开头,它将无法按预期工作)。
这| FIND
是一个很好的选择,可以在不显示无关紧要的文本的情况下显示发生的事情。
如果您从 Powershell 运行 7-zip.exe,并且只想查看错误,则可以尝试以下操作:
7-zip.exe u <Target> <Source> | Select-String "Error" -Context 10
这将仅显示“错误”消息行和周围的 10 行(或任何数字)以捕获特定于错误的输出。
7-zip 没有这样的选项。加上每个压缩文件打印的行应该显示在同一个位置,没有换行符,擦除前一个,效果很酷。不幸的是,在某些情况下(詹金斯......)它产生了几行☹️淹没控制台。
NUL
(windows) 可能是一种解决方案。
7-zip.exe -o some_dir x some_archive.7z>NUL
只显示最后 4 行...
7z x -y some_archive.7z | tail -4
给我:
Everything is Ok
Size: 917519
Compressed: 171589
开关 -y 是对所有事情回答是(在我的情况下是覆盖现有文件)。
在类 Unix 操作系统(Linux、BSD 等)上,shell 命令将丢弃所有写入标准输出7z ... >/dev/null
的文本。这应该涵盖所有由.7z
7z
似乎7z
将错误消息写入标准错误,因此如果您这样做>/dev/null
,仍然会显示错误消息。
正如上面的 Fr0sT 所说, -ba 开关只输出有效的东西(至少在我尝试的列表选项中)。7z.exe l archive_name.zip
7z.exe l -ba archive_name.zip
有很大的不同,尤其是用于解析脚本中的输出。无需修改任何东西,只需在version19中使用-ba开关即可。这也是上面有人说的。我无法发表评论,因此我将其作为答案。
您可以使用 -y 开关阻止 7-Zip 显示提示。这将对所有提示回答是。只有当你有信心时才使用它。
在十六进制编辑器中找到版权并将其值替换为 0000 https://imgur.com/a/ZJswkyq