Como posso extrair recursivamente arquivos zip no Windows, incluindo exclusão?

Como posso extrair recursivamente arquivos zip no Windows, incluindo exclusão?

Como posso extrair recursivamente arquivos zip no Windows? Cada arquivo zip deve ser descompactado em um novo subdiretório e o arquivo zip deve ser excluído posteriormente.

Cada diretório existente ou criado deve ser verificado em busca de outros arquivos zip existentes e assim por diante.

Portanto, o problema é que tenho um arquivo zip enorme, que contém muitos diretórios com talvez muitos outros arquivos zip. Os arquivos zip originais devem simplesmente ser liberados de quaisquer arquivos zip, a árvore de diretórios original deve ser mantida, com a convenção de que cada arquivo zip deve ser representado como um diretório próprio.

Portanto, a lógica por trás é: descompacte o arquivo em um diretório e exclua o arquivo zip -> entre nesse diretório e descompacte todos os arquivos zip da mesma maneira -> entre em todos os subdiretórios existentes do diretório e faça o mesmo -> e assim por diante recursivamente

Proposta aproximada para um arquivo de script em lote programado recursivamente:

unzip_folder(%%directory):

  for %%file (%%directory/*.zip) do (unzip %%file | del %%file)

  for /d %%directory (*) do ( call unzip_folder(%%directory) )

  return

Responder1

Extrair agorafaz isso. Verhttp://www.extractnow.com/Usage.aspx#process. Esteja ciente de que o Chrome e talvez outros navegadores sinalizam o aplicativo como malware/spyware.O autor afirma que isso é apenas do instaladore aponta para umversão portátilpara quem não deseja o instalador (embora o Chrome também chame esse arquivo zip de malicioso).

Responder2

Isso deve funcionar para você (funciona para mim). Esteja ciente de que se houver outras pastas, ele irá recorrer a elas e descompactar tudo o que for possível. Minha recomendação: coloque seu arquivo zip em um diretório sozinho (e este arquivo em lote) antes de executar.

:: To actually include the path expansion character (tilde), I had to give valid numbers; see http://ss64.com/nt/rem.html for bug reference. Also, try call /? for more info.
@REM The %~n0 extracts the name sans extension to use as output folder. If you need full paths, use "%~dpn0". The -y forces overwriting by saying yes to everything. Or use -aoa to overwrite.
@REM Using `x` instead of `e` maintains dir structure (usually what we want)

:: If you want recursive, use FOR /R
@FOR /R %%a IN (*.zip) DO @(
    @if [%1] EQU [/y] (
        @7z x "%%a" -o"%%~dpna" -aoa
    ) else if [%1] EQU [/yd] (
        @7z x "%%a" -o"%%~dpna" -aoa
        @if errorlevel 1 (
            @echo There was an error so I won't delete
        ) else (
            REM You can also prompt with del /p
            @del "%%a"
        )
    ) else (
        @echo 7z x "%%a" -o"%%~dpna" -aoa
    )
)

@echo USAGE: Use /y to actually do the extraction. Use /yd to extract then delete the zip file.

Responder3

echo %rant%

Bem, aqui vamos nós... o resultado de horas de pesquisa, tentativas fracassadas e muita manipulação (até tentei o PowerShell - não suporta longos caminhos de arquivo prontos para uso -caramba!)... uma versão que realmente extrai arquivos recursivamente e os coloca todos em uma única pasta para exclusão...


Peguei a resposta de Pat e fiz muitas revisões... para suportar... longos caminhos de arquivo com mais de 260 caracteres!:

@echo off
setlocal enabledelayedexpansion enableextensions

set scriptDir=%~dp0

REM Clear the log files.
echo . > unzipLog.txt
echo . > unzipErrors.txt

mkdir DeleteMe >> unzipLog.txt 2>nul

REM Recurse through all common compressed archive files.
FOR /R %%a IN (*.zip,*.7z,*.rar,*.tar,*.gz) DO (
    @echo: >> unzipLog.txt 2>> unzipErrors.txt
    @echo: >> unzipLog.txt 2>> unzipErrors.txt
    @echo: >> unzipLog.txt 2>> unzipErrors.txt
    @echo: >> unzipLog.txt 2>> unzipErrors.txt
    @echo: >> unzipLog.txt 2>> unzipErrors.txt

    REM Prepend \\?\ to the beginning of each path to handle paths longer than 260 characters.
    if [%1] EQU [/y] (
        REM Extract only.
        7z x "\\?\%%a" -o"%%~dpna" -aoa >> unzipLog.txt 2>> unzipErrors.txt
    ) else if [%1] EQU [/yd] (
        REM Extract and delete.

        for %%b in ("%%a") do (
            set p=%%~dpb
            set f=%%~nxb
        )

        IF !p:~-1!==\ SET p=!p:~0,-1!

        echo "!p!" "!scriptDir!DeleteMe" "!f!"
        echo "!p!" "!scriptDir!DeleteMe" "!f!" >> unzipLog.txt 2>> unzipErrors.txt

        7z x "\\?\%%a" -o"%%~dpna" -aoa >> unzipLog.txt 2>> unzipErrors.txt

        if errorlevel 1 (
            echo There was an error so I won't delete >> unzipLog.txt 2>> unzipErrors.txt
        ) else (
            robocopy "!p!" "!scriptDir!DeleteMe" "!f!" /MOVE /FP /NS /NC /NFL /NDL /NP /IS /IT /SL >> unzipLog.txt 2>> unzipErrors.txt
        )
    ) else ( 
        REM Just echo.
        echo 7z x "\\?\%%a" -o"%%~dpna" -aoa >> unzipLog.txt 2>> unzipErrors.txt
    )
)

REM Can comment this out if you just want to extract the archives to a folder and not delete them...:
REM WARNING: recommended call this manually and very carefully!!!
REM rmdir /S /Q DeleteMe
REM WARNING: recommended call this manually and very carefully!!!

echo Use /y to actually do the extraction. Use /yd to extract then delete the zip file.
echo See unzipLog.txt and unzipErrors.txt!

endlocal

Responder4

Pat modificados já que '''setx PATH "%PATH%;C:\Program Files\7-Zip"''' de Andrew não estava funcionando por algum motivo:

@FOR /R %%a IN (*.zip) DO @(
    @if [%1] EQU [/y] (
        @"C:\Program Files\7-Zip\7z.exe" x "%%a" -o"%%~dpna" -aoa
    ) else if [%1] EQU [/yd] (
        @"C:\Program Files\7-Zip\7z.exe" x "%%a" -o"%%~dpna" -aoa
        @if errorlevel 1 (
            @echo There was an error so I won't delete
        ) else (
            REM You can also prompt with del /p
            @del "%%a"
        )
    ) else (
        @echo "C:\Program Files\7-Zip\7z.exe" x "%%a" -o"%%~dpna" -aoa
    )
)

@echo USAGE: Use /y to actually do the extraction. Use /yd to extract then delete the zip file.

Enquanto estava em cmd.exe no caminho com o arquivo .zip, executei-o com "unzipRecursively0.bat /yd".

informação relacionada