如何使用 7zip 命令行版本递归提取压缩在 .tgz 文件中的所有 .tar 和 .tgz 文件

如何使用 7zip 命令行版本递归提取压缩在 .tgz 文件中的所有 .tar 和 .tgz 文件

我在我的应用程序中使用 7zip cmd 行版本(在 Win 7 机器上用 Python 编写)来提取 .tgz 文件。虽然我使用了 -r 开关,但 .tar 和 .tgz 子目录并未提取。有人能告诉我我是否忽略了什么或给我一些指导吗...谢谢!以下是我迄今为止尝试过的命令的变体:

C:> 7za e c:\Extracted\name.tgz -oc:\PathFolder *.tar -r

答案1

这里是可以执行您想要的操作的代码(注意:它保留了所有目录结构。如果您不想要这样,请将其更改为xe在 powershell 中运行它)

$cont=true  
cd c:\Extracted  
$TarFilesToExtract = get-childItem *.tar -Recurse  
$TgzFilesToExtract = get-childItem *.tgz -Recurse  
foreach($file in $TarfilesToExtract)  
{   
    7z x $file -oC:\Pathfolder    
}  
foreach($file in $TgzFilesToExtract)    
{  
    7z x $file -oC:\Pathfolder
}  
cd c:\Pathfolder  
while($cont -eq "true")  
{  
    $TarFilesToExtract = get-childItem *.tar -Recurse  
    $TgzFilesToExtract = get-childItem *.tgz -Recurse  
    if($TarFilesToExtract.Length -eq 0 -and $TgzFilesToExtract -eq 0)  
    {  
        $cont = "False"  
    }  
    else  
    {  
        foreach($file in $TarfilesToExtract)  
        {  
            7z x $file  
        }  
        foreach($file in $TgzFilesToExtract)  
        {  
            7z x $file  
        }  
    }  
}  

更简短的版本:

$cont=true
cd c:\Extracted
$files = get-childItem -include *.tar,*.tgz -Recurse
foreach($file in $TarfilesToExtract)
{
    7z x $file -oC:\Pathfolder
}
cd c:\Pathfolder  
while($cont -eq "true")
{
    $files = get-childItem -include *.tar,*.tgz -Recurse
    if($files.Length -eq 0)
    {
        $cont = "False"
    }
    else  
    {
        foreach($file in $files)
        {
            7z x $file 
        }
    }
}

答案2

对我来说效果很好:

FOR /R "C:\whatever" %I IN (*.gz) DO .7z x "%I" -aou -o"%~dpI"

C:\whatever是查找的路径、*.tgz要提取的文件类型以及.7z7zip 的位置(在本例中为 PATH 上)。

之后我还想删除所有压缩文件:

FOR /R "C:\whatever" %I IN (*.gz) DO del "%I"

正如链接的线程中提到的,最好先使用@ECHO 测试命令:

FOR /R "C:\whatever" %I IN (*.gz) DO @ECHO.7z x "%I" -aou -o"%~dpI"

答案3

这些是我对这个问题的看法:我创建了以下脚本来递归解压文件夹结构中的所有 .7z 和所有 .zip 文件。

您可能不需要 - 所以您可以根据需要删除这些行: - 因为我计划在提取后删除所有 .7z 和 .zip 文件,所以我创建了一个 cleanup.ps1 文件(出于安全原因,我没有立即删除档案)。 - 如果出现任何提取错误,我已将提取命令放入文件 ExecUnpack.ps1 中,以便能够再次提取单个档案

del "Cleanup.ps1"; 
del "ExecUnpack.ps1"; 
del "ExecUnpack.cmd"; 
get-childitem . -recurse -include @("*.7z","*.zip") | foreach { 
    """C:\Program Files\7-Zip\7z.exe"" x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""" | Out-File -Append "ExecUnpack.ps1"
    """C:\Program Files\7-Zip\7z.exe"" x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""" | Out-File -Append "ExecUnpack.cmd"
    $proc=[System.Diagnostics.Process]::Start("C:\Program Files\7-Zip\7z.exe", "x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))"""); 
    $proc.WaitForExit(); 
    echo "ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)"; 
    "#ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)" | Out-File -Append "Cleanup.ps1"; 
    "del ""$($_.FullName)""" | Out-File -Append "Cleanup.ps1"; 
}

其中主要部分如下:

get-childitem . -recurse -include @("*.7z","*.zip") | foreach { 
    $proc=[System.Diagnostics.Process]::Start("C:\Program Files\7-Zip\7z.exe", "x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))"""); 
    $proc.WaitForExit(); 
    echo "ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)"; 
}

相关内容