2017-02-15 22 views
1

Mit einer Cmd-Batch-Datei, wie kann ich alle Ordner in einem Verzeichnis durchlaufen und alle Zip-Dateien in jedem Ordner entpacken? Ich bin so weit gekommen, alle Unterordner zu durchlaufen, aber ich kann nicht in jedem Unterordner iterieren.Alle Zip-Dateien in allen Unterverzeichnissen entpacken

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

Die Ordnerstruktur

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

ich den Inhalt jeder haben möchte in ihr containting Ordner extrahiert Zip-Datei. Die Zip-Dateien und die Unterordner haben unterschiedliche Namen.

+2

'unzip' ist nicht Standard-Windows-Befehl. Woher kommt es? – npocmaka

+1

'(* /% RR)' kann nicht funktionieren. Ein Platzhalter in einem Pfad wird vom Windows-Befehlsinterpreter nicht unterstützt. Das zweite Prozentzeichen fehlt, was offensichtlich ein Tippfehler ist, da es zwei "R" statt zwei "%" gibt. Und das Verzeichnistrennzeichen unter Windows ist der umgekehrte Schrägstrich und nicht der Schrägstrich. So viele Fehler in einer so kurzen Linie. Haben Sie jemals in einem Eingabeaufforderungsfenster 'for /?' Ausgeführt und die Ausgabehilfe für diesen Befehl gelesen? – Mofi

+0

schön Ich wusste nicht über diesen Hilfe-Befehl Danke, ich habe die ursprüngliche Antwort mit diesem Befehl bearbeitet, nur um die Frage zu verbessern, aber ich fügte was immer ich zuletzt in der Batch-Datei versucht in Fiedeln mit den Befehlen. – Snickdx

Antwort

0

Versuchen mit dem zipjs.bat:

@echo off 

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

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

Dies war die Ausgabe, es ist etwa 34 Unterordner '****** BATCHRECURSION überschreitet STACK Grenzen ****** Rekursion Count = 261, Stack Usage = 90 Prozent ****** BATCH VERARBEITUNG WIRD ABGEBROCHEN ****** ' – Snickdx

+0

@Snickdx - der Fehler sagt, dass es' 261' verschachtelte Aufrufe von 'CALL' gibt. Es ist schwer zu glauben, dass es aus dem Code in meiner Antwort produziert wird ... – npocmaka

+0

Entschuldigung, ich schien Ihre Antwort falsch interpretiert zu haben, dachte ich, dass der bereitgestellte Code in einer Batch-Datei namens zipjs.bat abgelegt werden sollte Es ist ein Link zum echten Skript. – Snickdx

1

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


Ich nehme an zip1 Datei aus Ihrem Beispiel ist zip1.zip und dass es könnte mehr Zip-Dateien in jedem Unterordner sein . Wenn nicht, funktioniert dies auch für eine Zip-Datei. Und es gibt eine Alternative am Ende des Skripts für Zip-Dateien w/o .zip

Diese Dateien, die ich für einen Test verwendet. Es gibt einen absichtlichen Platz im "Unterordner", weil es immer gut ist, Batch-Skript gegen Pfadnamen mit Leerzeichen zu testen.

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 

entpacken ist kein Windows-Befehl. Es kann von vielen Quellen kommen und so könnte das Format seiner Parameter abweichen. In meinem Beispiel verwende ich 7zip.
Wie auch immer, wahrscheinlich müssen Sie das Ausgabeverzeichnis mit einem beliebigen Unzip-Dienstprogramm (oder CD dazu) angeben. Mein Beispiel zeigt, wie man seinen Namen erhält. Es gibt einen Schrägstrich am Ende, der mit 7z in Ordnung ist, aber könnte ein Problem mit anderen Dienstprogramm sein. Es ist möglich, es loszuwerden, aber es würde mehr Code erfordern.

Sie haben gebeten, alle Zip-Dateien in ein eigenes Verzeichnis zu extrahieren. Wenn jedoch zwei Zip-Dateien Dateien mit demselben Namen enthalten, überschreiben sie sich gegenseitig. Daher ist es möglicherweise sinnvoller, jede Zip-Datei in einen eigenen Ordner mit demselben Namen wie die ZIP-Datei zu extrahieren. Dazu muss der Ordner erstellt werden und das gesamte Skript würde mehr als eine Zeile verdienen.

Es gibt ein Misstrauen gegen für/d
Deshalb habe ich für/f Version auch enthalten, die

Bei dir-Befehl verwenden, würden Sie diesen Befehl mehr rekursiv verwenden möchten, mit tiefer Pfade, wie: folder\subfolder3\more\paths\zip1.zip, ist dies möglich. Verwenden Sie einfach das for /f aus meinem Beispiel unten und fügen Sie zum dir Befehl hinzu: 'dir *.* /s /ad /b'.

Dieser Befehl sollte das tun, was Sie gefragt:
for /d %%r in (*) do for %%s in ("%%r\*.zip") do 7z x -y "%%s" -o"%%~dps"

und hier ist die gesamte Testfall Skript:

@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" 
    ) 
Verwandte Themen