3

Как я могу рекурсивно извлечь zip-файлы в Windows? Каждый zip-файл должен быть распакован в новом подкаталоге, а zip-файл должен быть впоследствии удален.

Каждый существующий или созданный каталог должен быть отсканирован на предмет наличия существующих zip-файлов и т.д.

Так что проблема в том, что у меня есть огромный zip-файл, который содержит много каталогов с, возможно, многими другими zip-файлами. Исходные zip-файлы должны быть просто освобождены от любых zip-файлов, оригинальное дерево каталогов должно быть сохранено с условием, что каждый zip-файл должен быть представлен как собственный каталог.

Таким образом, логика заключается в следующем: разархивировать файл в каталоге и удалить файл ZIP -> перейти в этот каталог и разархивировать все файлы ZIP там же -> перейти в каждый существующий подкаталог каталога и сделать то же самое -> и так далее рекурсивно

Грубое предложение для рекурсивно запрограммированного файла пакетного сценария:

unzip_folder(%%directory):

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

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

  return

3 ответа3

2

ExtractNow делает это. См. Http://www.extractnow.com/Usage.aspx#process. Помните, что Chrome и, возможно, другие браузеры помечают приложение как вредоносное / шпионское ПО. Автор утверждает, что это только из установщика и указывает на портативную версию для тех, кто не хочет установщик (хотя Chrome также называет этот zip-файл вредоносным).

1

Это должно работать для вас (работает для меня). Просто имейте в виду, что если есть какие-либо другие папки, они будут проходить через них и распаковывать все возможные. Моя рекомендация: поместите ваш zip-файл в dir-файл (и этот пакетный файл) перед запуском.

:: 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.
1
echo %rant%

Ну что ж, поехали ... результат многих часов исследований, неудачных попыток и много хлопот (даже пробовал PowerShell - не поддерживает длинные пути к файлам из коробки - блин!)... версия, которая фактически рекурсивно извлекает архивирует и помещает их все в одну папку для удаления ...


Я взял ответ Пэт и сделал много изменений ... для поддержки ... длинных путей к файлам длиной более 260 символов !:

@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

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