使用Windows中的进度通过命令行解压缩.tar.gz

时间:2017-02-21 23:26:44

标签: windows cmd gzip extract tar

我正在尝试使用命令行在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函数获得)。此外,进度不是线性的,只有在提取文件时才会改变(EG如果我的targz包含2个非常大的文件,我在提取过程中只能得到0%,50%和100%)

3 个答案:

答案 0 :(得分: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),而unarchive部分仅显示错误(-bso0 -bsp0,禁用输出,禁用进度)。

您也可以采用相反的方式

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

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

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

答案 1 :(得分: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 :(得分:0)

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