2017-02-15 29 views
1

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

FOR /D %%R IN ("*") DO FOR /D %%S IN (*/%RR) unzip %%S 

Структура папки

folder\subfolder1\zip1 
folder\subfolder2\zip2 
folder\subfolder3\zip3 
folder\subfolder4\zip4 

Я хотел бы иметь содержимое каждого ZipFile извлекается в ней containting папку. Почтовые файлы и подпапки имеют разные имена.

+2

'unzip' не является стандартной командой окна. Откуда он? – npocmaka

+1

'(* /% RR)' не может работать. Подстановочный шаблон в пути не поддерживается командным интерпретатором Windows. Отсутствует второй знак процента, который, очевидно, является типичной ошибкой, так как существует два 'R' вместо двух'% '. И разделитель каталога в Windows является символом обратной косой черты, а не символом косой черты. Так много ошибок в такой короткой строке. Вы когда-либо выполняли в окне командной строки 'for /?' И читали выходную справку для этой команды? – Mofi

+0

nice Я не знал о том, что помог команде спасибо, я отредактировал исходный ответ с этой командой, чтобы улучшить вопрос, но я вставил все, что я пробовал последним в пакетном файле, играя с командами. – Snickdx

ответ

0

Try с zipjs.bat:

@echo off 

for /r %%s in (*.zip) do (

    call zipjs.bat unzip -source "%%~fs" -destination "%%~dpns" -keep yes -force yes 
) 
+0

Это был выход, около 34 вложенных папок '****** BATCHRECURSION превышает пределы STACK ****** Количество рекурсий = 261, использование стека = 90 процентов ****** ОБРАБОТКА ОБНАРУЖЕНИЯ БАТАРЕЙ ****** ' – Snickdx

+0

@Snickdx - ошибка говорит о том, что есть' 261' вложенные вызовы команды 'CALL'. Трудно поверить, что это сделано из кода в моем ответе ... – npocmaka

+0

Извините, что я, кажется, неправильно истолковал ваш ответ, я думал, что предоставленный код должен быть помещен в пакетный файл и назван zipjs.bat, но я просто понял, что его ссылка на реальный скрипт. – Snickdx

1

for /d %%r in (*) do for %%s in ("%%r\*.zip") do echo ---unzip %%s using output folder %%~dps


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

Эти файлы я использовал для теста. В «подпапке» есть намеренное место, потому что всегда полезно тестировать Batch-скрипт на пути с пробелами.

C:\temp\folder\sub folder1\zip1.zip 
C:\temp\folder\sub folder1\zip1b.zip 
C:\temp\folder\subfolder2\zip2.zip 
C:\temp\folder\subfolder2\zip2b.zip 
C:\temp\folder\subfolder3\zip3.zip 
C:\temp\folder\subfolder3\zip3b.zip 
C:\temp\folder\subfolder4\zip4.zip 
C:\temp\folder\subfolder4\zip4b.zip 

unzip не является командой Windows. Он может исходить из многих источников, поэтому формат его параметров может отличаться. В моем примере я использую 7zip.
В любом случае вам, вероятно, нужно будет указать выходной каталог с помощью любой утилиты unzip (или компакт-диска). В моем примере показано, как получить свое имя. В конце есть косая черта, что отлично с 7z, но может быть проблемой с другой утилитой. Из этого можно избавиться, но для этого потребуется больше кода.

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

Существует недоверие к для/д
Вот почему я включил для/ф версии, которая использовать реж команды

В случае, если вы хотите использовать эту команду более рекурсивно, с глубже пути, как: folder\subfolder3\more\paths\zip1.zip, это возможно. Просто используйте for /f из моего примера ниже и добавьте /s в команду dir: 'dir *.* /s /ad /b'.

Эта команда должна делать то, что вы просили:
for /d %%r in (*) do for %%s in ("%%r\*.zip") do 7z x -y "%%s" -o"%%~dps"

и здесь весь тест-случай сценарий:

@echo off 

echo ****** 
echo List all zip files using for /f 
echo ****** 
for /f "tokens=*" %%r in ('dir *.* /ad /b') do for %%s in ("%%r\*.zip") do echo ---unzip %%s using output folder %%~dps 

echo. 
echo ****** 
echo List all zip files using for /d 
echo ****** 
for /d %%r in (*) do for %%s in ("%%r\*.zip") do echo ---unzip %%s using output folder %%~dps 

echo. 
echo 1: extract to folders containing zip files - possible overwrites 
echo 2: extract each zip to a folder named by the name of the zip file 
choice /c 12 
if not errorlevel 2 (

    for /d %%r in (*) do for %%s in ("%%r\*.zip") do 7z x -y "%%s" -o"%%~dps" 

) else (

rem ------ this is the alternative to extract each zip to its own folder 
    for /d %%r in (*) do for %%s in ("%%r\*.zip") do (
     echo. 
     echo ****** 
     echo *** Unzipping: %%s to folder: %%~dpns 
     mkdir "%%~dpns" 
     7z x -y "%%s" -o"%%~dpns" 
    ) 
rem ------ 

) 
pause 

exit /b 

In case zip files does not have .zip extension: 

    for /d %%r in (*) do for %%s in ("%%r\*.*") do (
     echo. 
     echo ****** 
     echo *** Unzipping: %%s to folder: %%~dpns-unzipped 
     mkdir "%%~dpns-unzipped" 
     7z x -y "%%s" -o"%%~dpns-unzipped" 
    )