我正在尝试使用命令行在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运行),我认为这是因为流输入和输出。
我知道winrar即使在执行此操作(提取tgz文件)时也可以显示进度百分比,那么我如何才能获得相同的结果呢?
我能得到的最接近我的目标是得到输出目录的大小,然后除以tar.gz文件的未压缩大小(通过7z.exe l函数得到)。此外,进程也不是线性的,只有当文件被提取时才会发生变化(EG如果我的targz包含2个非常大的文件,那么在提取过程中我只能获得0%,50%和100% )
发布于 2017-02-28 06:16:36
许多程序员都安装了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命令。
发布于 2017-03-01 00:48:45
这是一种选择
@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%"
)进度指示器取决于正在进行的操作,因此请选择更适合您情况的操作。
备注:不,不需要以这种方式编写管道,只是为了缩短代码行并使示例代码更易于阅读。
发布于 2017-02-28 00:12:47
您可以将C#源代码带到TarTool,并添加您自己的钩子来显示进度。它基于SharpZipLib,它具有您可以连接到的事件来处理进度。
https://stackoverflow.com/questions/42379939
复制相似问题