我正在尝试使用命令行在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%)
答案 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,其中包含可以处理进度的事件。