提取 7-Zip 文件时如何“静默”操作 - 命令行选项

36

我希望在Python脚本中提取7-Zip存档。它可以正常工作,但会输出大量提取细节。

有没有一种方法在提取时避免冗长的信息?我没有找到任何“静默”命令行选项来运行 7z.exe

我的命令是

7z.exe -o some_dir x some_archive.7z
13个回答

45

我在寻找同样的内容时发现了这个问题,但是我自己解决了!假设使用 Windows / DOS 处理该命令,则更简单的解决方案是将您的命令更改为:

我在搜索相同内容时遇到了这个问题,但我已经自行解决了!如果使用Windows/DOS处理此命令,一个更简单的解决方案是将您的命令更改为:

7z.exe -o some_dir x some_archive.7z > nul

也就是说,将输出导向空文件而不是屏幕。

或者您可以将输出流管道传输到DOS的"find"命令中,以仅输出特定数据,也就是

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

这将取消单个文件处理,但生成总体操作的摘要,而不管操作类型。


2
好的解决方案。如果像我一样不喜欢Igor,您可以使用以下命令删除他:... some_archive.7z | FIND /V "ing " | FIND /V "Igor Pavlov" - mles
1
它按预期工作,但可以改进。在较新的7-Zip v 19.00版本中,您可以添加命令-bsp0,将删除状态栏进度,并对性能产生良好影响。示例命令:7-Zip_19.0\7za.exe -bsp0 x MyArchive.7z -oMyArchiveOutputPath - Ionut V.

12

一种可能的方法是使用 popen 来生成子进程,这样它的输出将会返回给父进程进行处理或显示(如果需要),否则可以完全忽略(创建 popen 对象时使用 stdout=PIPEstderr=PIPE 可以检索子进程的输出)。


谢谢,那很有帮助。我尝试了subprocess.Popen。但是我的父进程在子进程返回之前就完成了。我想在继续之前检查子进程的returncode。我正在查看文档,但如果您知道如何手动停止(特别是使用stdout=PIPE),请告诉我。 - sambha
2
在Windows上有什么相当的解决方案?http://stackoverflow.com/questions/5966063/redirect-7-zips-command-line-output-to-dev-null-on-windows-when-extracting-a-7z... - Peter Mounce
subprocess.PIPE,参见示例https://dev59.com/gV8f5IYBdhLWcg3wEPEq。还要查看subprocess对象的7Za返回代码http://sevenzip.sourceforge.jp/chm/cmdline/exit_codes.htm - 可以很方便。 - Michael Stimson

7
像他们说的那样,要隐藏大部分占据屏幕的消息,您可以使用...some_archive.7z | FIND /V "Compressing",但是"FIND"也会删除具有该单词的错误消息。您将不会收到警告。由于较新的7-zip版本,这个“FIND”也可能需要更改。
7-zip具有强制详细输出,没有静默模式,混合了stderr和stdout(*),不保存Unix权限等问题。这些反标准的行为一起将“7-zip”与例如“tar+bzip2”或“zip”相比放在了一个不好的位置。
(*)“上游(Igor Pavlov)不想为消息制作不同的输出,尽管多次要求他这样做:(”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

4
如果你正在从Powershell运行7-zip.exe,并且只想查看错误信息,那么你可以尝试类似于以下的代码:
7-zip.exe u <Target> <Source> | Select-String "Error" -Context 10

这将仅显示“Error”消息行及其周围的10行(或任何数量),以捕获特定错误输出。


3

扩展 @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$"
  • /V: 排除
  • /R: 正则表达式
  • /C:"^Compressing " : 行首,Compressing,2个空格
  • /C:"^Scanning$" : 单独一行的单词“Scanning”(开头/结尾)
  • /C:"^$" : 开始和结束之间没有任何内容,即一个空行

我使用/C,这样空格就是空格,否则它将作为多个单词之间的分隔符,如在这个简化版本中所示:

FINDSTR /V "Compressing Pavlov Scanning Everytyhing"

(同样的警告存在,如果措辞在新版本中发生变化,或者有一个有用的行以“压缩”一词开头,则它将无法按预期工作。)

3

7zip没有显式的命令行提取"quiet"或"silent"模式。

一种可能的方法是使用popen生成子进程,这样它的输出将返回到父进程进行处理/显示(如果需要),否则完全忽略(创建popen对象时,使用stdout=PIPE和stderr=PIPE可以检索子进程的输出)。

否则尝试这样做:

%COMSPEC% /c "%ProgramFiles%\7-Zip\7z.exe" ...

2
| FIND是一种很好的替代方法,可以显示发生了什么,而不显示无关紧要的文本。

2
显示最后4行...
7z x -y some_archive.7z | tail -4

给我:
Everything is Ok

Size:       917519
Compressed: 171589

开关-y是用来回答“是”以覆盖现有文件的(在我的情况下)。

1
7-zip没有这样的选项。另外,每个压缩文件打印的行应该在同一位置显示,而不是换行,擦除以前的行,这有一个很酷的效果。不幸的是,在某些情况下(如Jenkins...),它会产生多行☹️淹没控制台。
NUL(Windows)可能是一种解决方案。
7-zip.exe -o some_dir x some_archive.7z>NUL

1
检查了7zip的源代码,我发现了一个隐藏的开关-ba似乎可以解决问题。不幸的是,它还没有完成。我通过修改源代码使其工作,但这只是一种hack方法。如果有人感兴趣,选项变量被称为options.EnableHeaders,需要在CPP/7zip/UI/Console/Main.cpp文件中进行更改。 或者你可以联系7Zip的作者,在tracker上完成这个功能。这方面有几个请求,其中之一是here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接