Пакетная распаковка всех ZIP-архивов в подкаталогах; содержимое каждого архива извлекается в новый каталог с именем архива

2693
Chris Jackson

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

Мне было интересно, как распаковать эти файлы в папку, названную в честь zip-файла. Так, например:

C:\Archives\Photos\A.zip C:\Archives\Videos\B.zip C:\Archives\Documents\C.zip 

превратится в

C:\Archives\Photos\A\ C:\Archives\Videos\B\ C:\Archives\Documents\C\ 

Я могу сделать это в настоящее время, но только если я делаю это по одной папке за раз, мне было интересно, есть ли способ сделать все это сразу, я думал о файле .bat.

3

2 ответа на вопрос

2
LotPings
@Echo off For %%F in (Photos,Videos,Documents) Do ( For /F "delims=" %%Z in ('Dir /B/S/A-D "C:\Archives\%%F\*.zip" 2^>Nul') Do ( 7z x "%%~fZ" -o"%%~dpnZ\" && Rem Del "%%~fZ" ) ) 

Если вы хотите удалить файл zip после успешного распаковывания, удалите Remперед del.

Пакет использует для переменных ~ модификаторы, чтобы использовать только части полного имени файла

1
FosseWay

Однострочная оболочка PowerShell для достижения этой цели:

Get-ChildItem -Filter *.zip -Recurse C:\Archives | % { $_.FullName } | Split-Path | Get-Unique | % { cd $_ ; &'C:\Program Files\7-Zip\7z.exe' x *.zip -o* } 

Вот объяснение каждого раздела, который передается в следующий раздел и, таким образом, выполняется Powershell по порядку:

  • Get-ChildItem -Filter * .zip -Recurse C: \ Archives : найти все zip-файлы в C: \ Archives
  • % {$ _. FullName} : для каждого результирующего объекта показывать полный путь и имя
  • Split-Path : показать только путь (не имя файла) каждого почтового индекса
  • Get-Unique : удалить дубликаты из этого списка
  • % : наконец, используйте созданный список, чтобы перейти в каждый найденный каталог; используйте 7z.exe, чтобы распаковать все zip-файлы, найденные в каждом каталоге, с аргументом -o *, чтобы распаковать содержимое каждого zip-файла в каталог с именем этого zip-файла.

Предположения:

  • C: \ Archives - это каталог, в котором хранятся все ваши zip-файлы.
  • Ваш 7-Zip установлен в папку по умолчанию

Исследуя этот вопрос, я пришел к выводу, что предпочитаю bash PowerShell :-)

Ну, я считаю 6 команд плюс 7z. И вы не ограничиваетесь данными папками. Названия почтовых индексов A, B, C не нуждаются в цитировании, но вы никогда не узнаете. `gci C: \ Archives \ *. zip -r |% {& '7z.exe' x $ _. FullName -o $ _. Directory + $ _. BaseName}` также подойдет. LotPings 7 лет назад 0
Только команда 7z изменяет что-либо на диске. Остальные подключены к последней команде 7z. Я отредактировал свой ответ из «одной команды PowerShell» в «PowerShell one-liner», чтобы отразить ваше семантическое наблюдение. В исходном вопросе я ничего не видел об «ограничении указанными папками», кроме C: \ Archives \ верхнего уровня, поэтому я не пытался это сделать. Либо «тонна подпапок» означает «три подпапки», либо я был прав, не ограничиваясь примерами папок. FosseWay 7 лет назад 0
@FosseWay Я попытался запустить скрипт и продолжаю получать следующую ошибку: Get-ChildItem: Невозможно найти позиционный параметр, который принимает аргумент "%". В строке: 1 символ: 1 + Get-ChildItem -Filter * .zip -Recurse H: \ Literature \ To-Sort% {$ _. Fu ... + ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ + CategoryInfo: InvalidArgument: (:) [Get-ChildItem], ParameterBindingException + FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell.Commands.GetChildItemCommand Chris Jackson 7 лет назад 0
Жаль это слышать, @ChrisJackson. Что происходит, когда вы запускаете только `Get-ChildItem -Filter * .zip -Recurse C: \ Archives`? FosseWay 7 лет назад 0

Похожие вопросы