Partia rozpakuj wszystkie archiwa zip w podkatalogach; zawartość każdego archiwum wyodrębniona do nowego katalogu o nazwie po archiwum

4

Mam folder z mnóstwem podfolderów, w tych podfolderach znajdują się spakowane pliki.

Zastanawiałem się, jak rozpakować te pliki do folderu o nazwie po pliku zip. Na przykład:

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

zamieniłby się w

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

Mogę to zrobić obecnie, ale tylko jeśli zrobię to jeden folder naraz, zastanawiałem się, czy istnieje sposób, aby zrobić to wszystko naraz, myślałem o pliku .bat.

Chris Jackson
źródło

Odpowiedzi:

2
@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"
    )
)

Jeśli chcesz odrzucić plik zip po pomyślnym rozpakowaniu, usuń Remprzed del.

Partia używa modyfikatorów zmiennej ~ do używania tylko części pełnej nazwy pliku

LotPings
źródło
1

Jednowarstwowy PowerShell, aby to osiągnąć:

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

Oto wyjaśnienie każdej sekcji, która jest przenoszona do następnej sekcji, a zatem wykonywana przez PowerShell w celu:

  • Get-ChildItem -Filter * .zip -Recurse C: \ Archives : znajdź wszystkie pliki zip w C: \ Archives
  • % {$ _. FullName} : dla każdego wynikowego obiektu, pokaż pełną ścieżkę i nazwę
  • Podziel ścieżkę : pokazuje tylko ścieżkę (nie nazwę pliku) każdego zip
  • Get-Unique : usuń duplikaty z tej listy
  • % {cd $ _; & „C: \ Program Files \ 7-Zip \ 7z.exe” x * .zip -o *} : w końcu użyj utworzonej listy, aby przejść do każdego znalezionego katalogu; użyj 7z.exe, aby rozpakować wszystkie pliki zip znalezione w każdym katalogu, z argumentem -o *, aby rozpakować zawartość każdego pliku zip do katalogu o nazwie tego pliku zip

Założenia:

  • C: \ Archiwa to katalog, w którym przechowywane są wszystkie pliki zip
  • Twój 7-Zip jest zainstalowany w domyślnej lokalizacji

Badając to pytanie, doszedłem do wniosku, że wolę bash niż PowerShell :-)

FosseWay
źródło
Cóż, liczę 6 poleceń plus 7z. I nie ogranicza się do podanych folderów. Nazwy zip A, B, C nie będą wymagały cytowania, ale nigdy nie wiadomo. gci C:\Archives\*.zip -r|%{&'7z.exe' x $_.FullName -o$_.Directory+$_.BaseName }zrobiłby również.
LotPings
Tylko polecenie 7z zmienia wszystko na dysku. Pozostałe są przesyłane do ostatniej komendy 7z. Zmieniłem odpowiedź z „pojedynczego polecenia PowerShell” na „jedno-liniowy PowerShell”, aby odzwierciedlić twoje obserwacje semantyczne. W pierwotnym pytaniu nie widziałem nic o „ograniczeniu do podanych folderów” poza C: \ Archives \ najwyższego poziomu, dlatego nie próbowałem tego. Albo „tona podfolderów” oznacza „trzy podfoldery”, albo miałem rację, nie ograniczając się do przykładowych folderów.
FosseWay,
@FosseWay Próbowałem uruchomić skrypt i ciągle pojawia się następujący błąd: Get-ChildItem: Nie można znaleźć parametru pozycyjnego, który akceptuje argument „%”. W wierszu: 1 znak: 1 + Get-ChildItem -Filter * .zip -Recurse H: \ Literature \ To-Sort% {$ _. Fu ... + ~~~~~~~~~~~~~~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~~~~~ + CategoryInfo: InvalidArgument: (:) [Get-ChildItem], ParameterBindingException + FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell.Commands.GetChildItemCommand
Chris Jackson
Przykro mi to słyszeć, @ChrisJackson. Co się stanie, gdy uruchomisz Get-ChildItem -Filter *.zip -Recurse C:\Archivessam?
FosseWay