2

У меня есть большая структура дерева папок Windows 7, содержащая много файлов ZIP . Это однослойные файлы ZIP (не ZIP внутри ZIP). Какую команду 7-Zip можно использовать для анализа этой структуры папок, поиска каждого ZIP-файла по расширению (см. Пример), его извлечения (удаления ZIP-файла, оставления извлеченных файлов) в одно и то же место?

Пример: все файлы в иерархии папок называются примерно так: abc.mp3.zip или xyz.jpg.zip - расширение собственного файла, за которым следует «.zip». Я хочу, чтобы 7-Zip находил все файлы в дереве по расширению, используя подстановочные знаки (* .mp3.zip, * .jpg.zip и т.д.), И извлекал их в текущее местоположение, не создавая новые папки, чтобы в результате получился abc. mp3 и xyz.jpg.

1 ответ1

2

Насколько я могу судить, у 7-zip нет команды, которая делает то, что вы ищете. Вот сценарий пакетного файла Windows, который, я думаю, сделает то, что вы хотите. Его следует запускать из командной строки, чтобы вы могли указать путь к корню дерева папок, которое нужно обработать.

Файл unzipper.bat

@echo off
setlocal
if "%1"=="" goto Usage

call :Get7zCmd
:: Recurse folder passed in as paramater
for /r %1 %%Z in (*.zip) do (
    echo ====
    rem Change to the directory of zip file
    cd /d "%%~dpZ"
    rem Extract all files to current directory
    echo %_7zCmd% e "%%~nxZ" -y
    rem Delete the zip file
    echo del "%%~nxZ"
)
goto End

:Usage
echo.
echo Parses through folder structure starting at the specified path, finding
echo and extracting the contents of all zip files found, and then deletes
echo the zip file.
echo.
echo Usage:
echo     %~n0 root-directory-path
echo.
echo     For example:
echo.
echo %~n0 "D:\some folder"

:End
goto :EOF

:: ==========================
:: Subroutine Get7zCmd
:: Determines the full path to 7-zip command-line executable from the Windows
:: Registry and sets the variable "_7zCmd" to the result.
:Get7zCmd
set Reg.Key=HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe
set Reg.Val=Path
for /F "Tokens=2*" %%A in ('Reg Query "%Reg.Key%" /v "%Reg.Val%" ^| find /I "%Reg.Val%"') do call set PathDirectory=%%B
set _7zCmd="%PathDirectory%%\7z.exe"
exit /b 0

Поскольку в целом то, что делает скрипт, является довольно радикальным и потенциально разрушительным, поскольку оно может извлечь большое количество файлов и впоследствии удалить множество zip-файлов, я отключил команды в строках 12 и 14, которые выполняли бы эти действия, добавив к ним префикс echo , Это заставляет их просто распечатать то, что они сделали бы, если бы echo не было. Таким образом, вы можете сначала протестировать скрипт, не повредив файловую систему, если возникнет какая-то неожиданная проблема.

Чтобы изменить скрипт на самом деле выполнять эти действия, вам нужно удалить echo в каждой из двух строк. Конечно, применяется стандартный отказ от ответственности.

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