Я использую строковую версию 7zip cmd в своем приложении (написано на Python для Win 7 box) для извлечения файлов .tgz. Хотя я использую ключ -r, подкаталоги .tar и .tgz не извлекаются. Может кто-нибудь сказать мне, если я пропускаю что-то или дать какое-то направление ... спасибо! Ниже приведен вариант команды, которую я пробовал таким образом:

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

3 ответа3

3

Вот код, который должен делать то, что вы хотите (примечание: он сохраняет все структуры каталогов. Если вы не хотите этого, измените x на e . Запустите это в 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 
        }
    }
}
0

Вот мои 5 центов на эту проблему: я создал следующий скрипт, чтобы рекурсивно распаковать все .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)"; 
}
0

Это хорошо сработало для меня:

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

C:\whatever того, какой путь искать, *.tgz - это типы файлов для извлечения, а .7z - местоположение 7zip (в данном случае это 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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .