Ordner und Dateien in einer Batchdatei durchlaufen?

Ordner und Dateien in einer Batchdatei durchlaufen?

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.exeals Extraktionstool für die Befehlszeile.

Mein Batch-Skript soll die Unterordner von " " durchlaufen Folder 0und 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 1und so weiter.

Ich habe gelesen über dieFOR...DOBefehl 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

File5Das 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.zipDatei ist das kein Problem. Aber wenn es tiefer in der Verzeichnisstruktur zu Unterordnern gräbt, File5mö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 File5in 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 PUSHDund 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.

verwandte Informationen