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

3

Como posso recursivamente extrair 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 para outros arquivos zip existentes, e assim por diante.

Então, o problema é que eu tenho um enorme arquivo zip, que contém muitos diretórios com talvez muitos outros arquivos zip. Os arquivos zip originais devem ser simplesmente liberados de qualquer arquivo zip, a árvore de diretório 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 disso é: descompactar o arquivo em um diretório e excluir o arquivo zip - > ir para esse diretório e descompacte todos os arquivos zip lá da mesma maneira - > entrar em todos os subdiretórios existentes do diretório e fazer 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
    
por Ewrt Wert 08.05.2012 / 12:05

3 respostas

2

ExtractNow faz isso. Consulte o link . Tenha em atenção que o Chrome e talvez outros navegadores sinalizem a aplicação como malware / spyware. O autor afirma que isso é apenas do instalador e aponta para um versão portátil para quem não quer o instalador (embora o Chrome também chame esse arquivo zip de malicioso).

    
por 08.05.2012 / 20:16
1

Isso deve funcionar para você (funciona para mim). Esteja ciente de que, se houver outras pastas, elas serão recortadas e descompactarão tudo o que for possível. Minha recomendação: coloque seu arquivo zip em um diretório sozinho (e esse arquivo em lote) antes de executá-lo.

:: 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.
    
por 19.09.2013 / 23:29
1
echo %rant%

Bem, aqui vamos nós ... o resultado de horas de pesquisa, tentativas fracassadas e muito mexer (até mesmo tentamos o PowerShell - não suporta caminhos de arquivos longos fora da caixa - sheesh! ) ... uma versão que realmente recursivamente extrai arquivos e coloca todos eles em uma única pasta para exclusão ...

Eu peguei a resposta de Pat e fiz muita revisão ... para suportar ... longos caminhos de arquivo além de 260 caracteres de comprimento!:

@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
    
por 28.10.2017 / 08:13

Tags