Entpacken Sie alle ZIP-Archive stapelweise in Unterverzeichnissen. Inhalt jedes Archivs wird in ein neues Verzeichnis extrahiert, das nach dem Archiv benannt wird

2706
Chris Jackson

Ich habe einen Ordner mit einer Menge von Unterordnern, in diesen Unterordnern befinden sich gezippte Dateien.

Ich habe mich gefragt, wie man diese Dateien in einen Ordner entpackt, der nach der ZIP-Datei benannt ist. So zum Beispiel:

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

würde sich in verwandeln

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

Ich kann dies im Moment tun, aber nur wenn ich einen Ordner zu einem bestimmten Zeitpunkt mache, habe ich mich gefragt, ob es einen Weg gibt, alles auf einmal zu machen. Ich dachte an eine .bat-Datei.

3

2 Antworten auf die Frage

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

Wenn Sie die ZIP-Datei nach erfolgreichem Entpacken verwerfen möchten, entfernen Sie die Datei Remvor del.

Der Stapel verwendet für variable ~ -Modifizierer nur Teile des vollständigen Dateinamens

1
FosseWay

Ein PowerShell-One-Liner, um dies zu erreichen:

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

Hier ist eine Erklärung für jeden Abschnitt, der in den nächsten Abschnitt geleitet wird und von Powershell in der folgenden Reihenfolge ausgeführt wird:

  • Get-ChildItem -Filter * .zip -Recurse C: \ Archives : Hier finden Sie alle ZIP-Dateien unter C: \ Archives
  • % {$ _. FullName} : Zeigt für jedes resultierende Objekt den vollständigen Pfad und Namen an
  • Split-Path : Zeigt nur den Pfad (nicht den Dateinamen) jeder ZIP-Datei an
  • Get-Unique : Entfernen Sie Duplikate aus dieser Liste
  • % : Verwenden Sie die erstellte Liste, um in jedes gefundene Verzeichnis zu wechseln. Verwenden Sie 7z.exe, um alle in jedem Verzeichnis gefundenen ZIP-Dateien zu entpacken. Mit dem Argument -o * können Sie den Inhalt jeder ZIP-Datei in ein Verzeichnis mit dem Namen dieser ZIP-Datei entpacken

Annahmen:

  • C: \ Archives ist das Verzeichnis, in dem alle ZIP-Dateien gespeichert werden
  • Ihr 7-Zip ist am Standardspeicherort installiert

Während ich diese Frage recherchierte, kam ich zu dem Schluss, dass ich bash der PowerShell bevorzuge :-)

Nun, ich zähle 6 Befehle plus 7z. Und Sie beschränken sich nicht auf die angegebenen Ordner. Die Zip-Namen A, B, C brauchen nicht zitiert zu werden, aber Sie wissen es nie. `gci C: \ Archives \ *. zip -r |% {& '7z.exe' x $ _. FullName -o $ _. Directory + $ _. BaseName}` würde dies ebenfalls tun. LotPings vor 6 Jahren 0
Nur der Befehl 7z ändert etwas auf der Festplatte. Die anderen werden zum letzten 7z-Befehl geleitet. Ich habe meine Antwort von "einem einzigen PowerShell-Befehl" in "einen PowerShell-Einzeiler" bearbeitet, um Ihre semantische Beobachtung widerzuspiegeln. Ich habe in der ursprünglichen Frage nichts anderes als "C: \ Archives \" auf der obersten Ebene gesehen. Daher habe ich es nicht versucht. Entweder bedeutet "eine Tonne Unterordner" "drei Unterordner", oder es war richtig, mich nicht auf die Beispielordner zu beschränken. FosseWay vor 6 Jahren 0
@FosseWay Ich habe versucht, das Skript auszuführen und erhalte folgende Fehlermeldung: Get-ChildItem: Es kann kein Positionsparameter gefunden werden, der das Argument '%' akzeptiert. An Zeile: 1 Zeichen: 1 + Get-ChildItem -Filter * .zip -Recurse H: \ Literature \ To-Sort% {$ _. Fu ... + ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ + CategoryInfo: InvalidArgument: (:) [Get-ChildItem], ParameterBindingException + FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell.Commands.GetChildItemCommand Chris Jackson vor 6 Jahren 0
Tut mir leid, das zu hören, @ ChrisJackson. Was passiert, wenn Sie `Get-ChildItem -Filter * .zip -Recurse C: \ Archives` alleine ausführen? FosseWay vor 6 Jahren 0