【问题标题】:Extract .tar.gz by command line with progress in windows在 Windows 中通过命令行提取 .tar.gz
【发布时间】:2017-02-21 23:26:43
【问题描述】:

我正在尝试使用命令行在 Windows 中提取 tar.gz 文件并获取进度百分比。 首先,我希望在单个操作中提取它(而不是提取 tar 然后解压缩)。我发现的唯一两个可以做到这一点的工具是Tartool 和 7zip。 Tartool 很好(也很容易发现错误)但是没有任何进展。 7zip你必须使用strem进出,所以我创建了一个基本的bat文件:

cd /d %~dp0
7z.exe x "%1" -so | 7z.exe x -aoa -si -ttar -o"%2"

提取效果很好,但整个过程中进度仍然是0%(我尝试从cmd运行),我认为这是因为流输入和输出。

我知道即使执行此操作(提取 tgz 文件),winrar 也可以显示进度百分比,那么我怎样才能获得相同的结果?

最接近我的目标的是获取输出目录大小并除以 tar.gz 文件的未压缩大小(通过 7z.exe l 函数获得)。进度也不是线性的,只有在提取文件时才会改变(例如,如果我的 targz 包含 2 个非常大的文件,我在提取过程中只能得到 0%、50% 和 100%)

【问题讨论】:

    标签: windows cmd gzip extract tar


    【解决方案1】:

    很多程序员都安装了Git for Windows。它带有一个很好的 Bash 环境,其中还包含 GNU tar。使用常规 tar 命令,您可以轻松使用 checking progress 的选项,尤其是 --checkpoint and --checkpoint-action options。和他们一起玩,你可以和他们一起做些好事,比如

    tar --checkpoint=1 --checkpoint-action=dot -xzf my-archive.tar.gz
    tar --checkpoint=1 --checkpoint-action=echo -xzf my-archive.tar.gz
    

    到更高级的东西,比如

    tar --checkpoint=1 --checkpoint-action="ttyout=Hit %s checkpoint #%u%*\r" -xzf my-archive.tar.gz
    tar --checkpoint=1 --checkpoint-action=ttyout='%{%Y-%m-%d %H:%M:%S}t (%d sec): #%u, %T%*\r' -xzf my-archive.tar.gz
    

    如果您不喜欢滚动消息但输出在线更新 - 或任何您喜欢的。你甚至可以运行任何你喜欢的 shell 命令。

    【讨论】:

      【解决方案2】:

      这是一种选择

      @echo off
          setlocal enableextensions disabledelayedexpansion
      
          for %%a in ("%~f1")  do set "inputFile=%%~fa"
          if not defined inputFile    goto :eof
          if not exist "%inputFile%"  goto :eof
          if exist "%inputFile%\"     goto :eof
      
          for %%a in ("%~f2.") do set "outputFolder=%%~fa"
      
          (
              7z.exe x -bsp2 -so "%inputFile%" 
          )|(
              7z.exe x -ttar -aoa -si -bso0 -bsp0 -o"%outputFolder%"
          )
      

      有两个不同的进程,你需要告诉他们谁会输出进度信息。在此代码中,解压缩部分将进度输出发送到标准错误流(-bsp2,将进度发送到流 2),而解压缩部分将仅显示错误(-bso0 -bsp0,禁用输出,禁用进度)。

      你也可以反过来做

          (
              7z.exe x -bsp0 -bse0 -so "%inputFile%" 
          )|(
              7z.exe x -ttar -aoa -si -bso0 -bsp2 -o"%outputFolder%"
          )
      

      进度指示器取决于正在执行的操作,因此请选择更适合您情况的操作。

      注意:不,不需要这样写管道,只是为了缩短行数并使示例代码更易于阅读。

      【讨论】:

        【解决方案3】:

        您可以将 C# 源代码带到 TarTool 并添加您自己的钩子以显示进度。它基于SharpZipLib,其中包含您可以连接到处理进度的事件。

        【讨论】:

        • SharpZipLib 无法处理超过 99 个字符的长文件,这意味着 TarTool 在这方面也失败了。
        猜你喜欢
        • 2016-04-27
        • 2018-05-05
        • 2023-03-26
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 2021-05-25
        相关资源
        最近更新 更多