【问题标题】:Extracting a 7-Zip file "silently" - command line option“静默”提取 7-Zip 文件 - 命令行选项
【发布时间】:2011-04-16 00:20:26
【问题描述】:

我想在 Python 脚本中提取 7-Zip 存档。它工作正常,只是它会吐出提取细节(在我的情况下这是巨大的)。

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

我的命令是

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

【问题讨论】:

    标签: 7zip


    【解决方案1】:

    一种可能性是使用popen 生成子进程,因此其输出将返回到父进程以进行处理/显示(如果需要)或完全忽略(使用stdout=PIPE 创建您的popen 对象和stderr=PIPE 以便能够从孩子那里检索输出)。

    【讨论】:

    【解决方案2】:

    我只是在搜索时遇到了这个问题,但我自己解决了!假设该命令是使用 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
    

    这会删除单个文件处理,但会生成整个操作的摘要,而不管操作类型如何。

    【讨论】:

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

    | FIND 是一个很好的选择,可以在不显示无关紧要的文字的情况下显示发生的事情。

    【讨论】:

      【解决方案4】:

      就像他们说的那样,要隐藏您可以使用的大多数屏幕填充消息... some_archive.7z | FIND /V “正在压缩”,但“FIND”也会删除包含该单词的错误消息。你不会被警告。由于更新的 7-zip 版本,该“查找”也可能需要更改。

      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

      【讨论】:

        【解决方案5】:

        7zip 没有用于命令行提取的显式“安静”或“静默”模式。

        一种可能性是使用 popen 生成子进程,因此其输出将返回到父进程以进行处理/显示(如果需要)或完全忽略(使用 stdout=PIPE 和 stderr=PIPE 创建您的 popen 对象以便能够从孩子那里检索输出)。

        否则尝试这样做:

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

        【讨论】:

          【解决方案6】:

          扩展@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" : 行首,压缩,2个空格
          • /C:"^Scanning$" : 在一行中单独扫描单词(开始/结束)
          • /C:"^$" : 开头和结尾之间没有任何内容,即空行

          我使用 /C 以便空格是空格,否则它是多个单词之间的分隔符,就像在这个更简单的版本中一样:

          FINDSTR /V "Compressing Pavlov Scanning Everytyhing"
          

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

          【讨论】:

            【解决方案7】:

            如果您从 Powershell 运行 7-zip.exe,并且只想查看错误,那么您可以尝试以下操作:

            7-zip.exe u <Target> <Source> | Select-String "Error" -Context 10
            

            这将只显示“错误”消息行和周围的 10 行(或任何数字)以捕获特定于错误的输出。

            【讨论】:

              【解决方案8】:

              您可以使用 -y 开关阻止 7-Zip 显示提示。这将对所有提示回答是。仅当您有信心时才使用它。

              【讨论】:

              • 这里我们说的是正常显示17% 1000 + directory\file_name.ext,不是用户的问题。你的解决方案是针对同样的问题吗?
              【解决方案9】:

              7-zip 没有这样的选项。加上每个压缩文件打印的行应该显示在同一个位置,没有换行符,擦除前一个,效果很酷。不幸的是,在某些情况下(詹金斯......)它产生了几行☹️淹没控制台。

              NUL (windows) 可能是一种解决方案。

              7-zip.exe -o some_dir x some_archive.7z>NUL
              

              【讨论】:

                【解决方案10】:

                检查 7zip 源,我发现隐藏的 -ba 开关似乎可以解决问题。不幸的是,它还没有完成。我设法使它与源的几个修改一起工作,但这只是一个黑客。如果有人感兴趣,选项变量称为options.EnableHeaders 并且需要在CPP/7zip/UI/Console/Main.cpp 文件中进行更改。 或者,您可以戳 7Zip 的作者以完成 tracker 中的功能。对此有几个请求,其中一个是here

                【讨论】:

                  【解决方案11】:

                  只显示最后 4 行...

                  7z x -y some_archive.7z | tail -4
                  

                  给我:

                  Everything is Ok
                  
                  Size:       917519
                  Compressed: 171589
                  

                  开关 -y 是对所有事情都回答是(在我的例子中是覆盖现有文件)。

                  【讨论】:

                    【解决方案12】:

                    在十六进制编辑器中找到版权并将其值替换为 0000 https://imgur.com/a/ZJswkyq

                    【讨论】:

                      【解决方案13】:

                      在类 Unix 操作系统(Linux、BSD 等)上,shell 命令7z ... &gt;/dev/null 会将7z 写入的所有文本丢弃到标准输出。这应该涵盖7z 编写的所有状态/信息消息。

                      似乎7z 将错误消息写入标准错误,所以如果您这样做&gt;/dev/null,仍然会显示错误消息。

                      【讨论】:

                        【解决方案14】:

                        正如上面的 Fr0sT 所说,-ba 开关只输出有效的东西(至少在我尝试的列表选项中)。 7z.exe l archive_name.zip

                        7z.exe l -ba archive_name.zip

                        有很大的不同,尤其是在脚本中解析输出。 无需修改任何东西,只需在version19中使用-ba开关即可。这也是上面有人说的。由于无法发表评论,我将其作为答案。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2010-11-21
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-08-18
                          相关资源
                          最近更新 更多