Hier ist meine Situation. Ein Projekt hat zum Ziel, einige Anhänge auf ein anderes System zu migrieren.
Diese Anhänge werden in einem übergeordneten Ordner abgelegt, beispielsweise " Folder 0
" (siehedas Diagramm dieser Fragezum besseren Verständnis) und diese werden gezippt/komprimiert.
Ich möchte, dass mein Batch-Skript folgendermaßen aufgerufen wird:
BatchScript.bat "c:\temp\usd\Folder 0"
Ich verwende es 7za.exe
als Extraktionstool für die Befehlszeile.
Mein Batch-Skript soll die Unterordner von " " durchlaufen Folder 0
und alle enthaltenen ZIP-Dateien in die entsprechenden Ordner extrahieren.
Die extrahierten Dateien müssen sich im selben Ordner wie die entsprechenden ZIP-Dateien befinden. Dateien, die in " File 1.zip
" enthalten sind, werden also in " " benötigt Folder 1
und so weiter.
Ich habe gelesen über dieFOR...DO
Befehl aufWindows XP Professional Product Documentation - Using Batch Files
.
Hier ist mein Skript:
@ECHO OFF
FOR /D %folder IN (%%rootFolderCmdLnParam) DO
FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile
Ich vermute, dass ich auch das aktuelle Verzeichnis ändern müsste, bevor ich 7za.exe und %zippedFile zum Extrahieren der Dateien aufrufe, aber ich kann in dieser Batchdatei nicht herausfinden, wie das geht (obwohl ich weiß, wie es in der Befehlszeile geht, und selbst wenn ich weiß, dass es dieselbe Anweisung „cd“ ist).
BEARBEITEN #1
Die unten angegebenen Antworten kommen meinen Anforderungen sehr nahe. Aber aus unbekannten Gründen passiert manchmal in der Batchdatei nichts, wenn ich einen Parameter eingebe, und ich werde zur Eingabeaufforderung zurückgeführt.
Ich habe seit etwa 15 Jahren keine Batchdatei mehr geschrieben und habe daher die Logik dahinter usw. völlig vergessen.
Kann mir bitte jemand helfen?
BEARBEITEN #2
Es scheint, ohne dass es irgendeine Gewissheit gibt, dass das Batchdateiskript Ordnernamen mit Leerzeichen nicht verarbeiten kann. Kann einer von Ihnen das bestätigen und eine Lösung vorschlagen, um dem entgegenzuwirken?
Ich werde hier völlig blind... Danke für eure Hilfe! =)
BEARBEITEN #3
Ich brauche eine vollständig rekursive Lösung, da ich die Verzeichnisstruktur, für die sie verwendet wird, nicht kenne. Tut mir leid, dass ich das nicht schon früher erwähnt habe.
BEARBEITEN #4
Alle Ihre und die Antworten anderer haben mich zu folgendem Ergebnis inspiriert (das zu 98 % funktioniert):
@echo off
setlocal enableextensions enabledelayedexpansion
rem
rem Display instructions when no parameter is given.
rem
if "%1" equ "" (
echo Syntaxe : od.bat ^<directory mask>^
echo Exemple : od.bat *
goto :Eof
)
rem
rem Setting the PATH environment variable for this batch file for accessing 7za.exe.
rem
path=c:\temp;%PATH%
rem
rem Removing quotes from the given command line parameter path.
rem
set root=%1
set root=%root:~%1
set root=%root:~0,-1%
rem Searching directory structure from root for subfolders and zipfiles, then extracting the zipfiles into a subfolder of the same name as the zipfile.
for /F "delims==" %%d in ('dir /ogne /ad /b /s %root%') do (
echo Traitement du dossier : "%%d"
for /F "delims==" %%f in ('dir /b "%%d\*.zip"') do (
rem Getting filename without extension.
set subfolder=~n%f
mkdir "%%d\%subfolder%"
rem Extracting zipfile content to the newly created folder.
7za.exe e "%%d\%%f" -o"%%d\%subfolder%"
)
)
:Eof
endlocal
File5
Das einzige Problem, das ich habe, ist, dass es, um bei meinem Beispiel zu bleiben, einen Unterordner erstellen möchte, in den die Zip-Datei extrahiert werden soll. Beim Extrahieren der eigentlichen File5.zip
Datei ist das kein Problem. Aber wenn es tiefer in der Verzeichnisstruktur zu Unterordnern gräbt, File5
möchte es, da es den letzten Dateinamen erhalten hat, beispielsweise den Unterordner File5 erstellen Folder 1\Folder A
, um zu extrahieren File1.zip
. Hier ist ein Beispiel für eine Struktur:
║
║═════ Folder 1
║ ║
║ ║══════ Folder A
║ ║
║ ║═════ File1.zip
║
║═════ Folder 5
║
║═════ File5.zip
In Anbetracht der oben dargestellten Struktur möchte es also File5
in erstellen Folder A
, obwohl es stattdessen erstellen beabsichtigen sollte File1
.
Danke für eure Unterstützung und Hilfe! =)
Wir sind für jede Hilfe dankbar.
BEARBEITEN #5
Ich habe die Antwort von @Dennis Williamson akzeptiert, da seine Lösung das erfüllt, was ich ursprünglich gefragt habe. Wenn Sie andernfalls nach einer vollständig rekursiven Lösung suchen, folgen Sie bitte dem in meiner eigenen Antwort angegebenen Link, der Sie zur StackOverflow-Website führt.
Antwort1
Sie können PUSHD
und verwenden POPD
:
@echo off
set rootFolderCmdLnParam=%1
FOR /D %%d IN (%rootFolderCmdLnParam%\*) DO pushd %%d & (FOR %%z IN (*.zip) DO 7za.exe e "%%z") & popd
Rufen Sie so auf:
BatchScript.bat "c:\temp\usd\Folder 0"
Antwort2
Hier ist ein Windows .CMD-Skript, das Ihnen vielleicht ein wenig hilft.
Es ist keine Komplettlösung, aber ich hoffe, dass es Ihnen zumindest einige Ideen liefert.
REM @echo off
setlocal enableextensions enabledelayedexpansion
if /I "%1" EQU "" (
echo Syntax: %0 ^<directory-mask^>
echo Example: %0 *
goto :EOF
)
for /D %%a in (%1) do call :ProcessFolder "%%a"
goto :EOF
:ProcessFolder
rem Changing working directory to '%1'. See 'HELP PUSHD'
pushd "%1"
for %%b in (*.zip) do call :ProcessFile "%%b"
popd
goto :EOF
:ProcessFile
rem Extract only filename-without-extension from %1 argument. See 'HELP FOR'
set SUBFLDR=%~n1
mkdir "%SUBFLDR%"
pushd "%SUBFLDR%"
echo Put processing here, like 7za.exe e "%1"
popd
goto :EOF
Antwort3
Sie können auch FORFILES.EXE mit dem Schalter /S verwenden. Dies ist auch im Resource Kit enthalten.
Antwort4
Die von @aphoria unter dem folgenden Link bereitgestellte Antwort ermöglicht es dem Skript, vollständig rekursiv zu sein, einen Unterordner mit demselben Namen wie die ZIP-Datei zu erstellen usw.
Hier ist der Link zur Antwort auf dieselbe Frage auf StackOverflow
Vielen Dank an alle, Sie haben mir alle sehr geholfen.