¿Iterando a través de carpetas y archivos en un archivo por lotes?

¿Iterando a través de carpetas y archivos en un archivo por lotes?

Aquí está mi situación. Un proyecto tiene como objetivo migrar algunos archivos adjuntos a otro sistema.

Estos archivos adjuntos se ubicarán en una carpeta principal, digamos " Folder 0" (consulteel diagrama de esta preguntapara una mejor comprensión), y serán comprimidos/comprimidos.

Quiero que mi script por lotes se llame así:

BatchScript.bat "c:\temp\usd\Folder 0"

Lo estoy usando 7za.execomo herramienta de extracción de línea de comando.

Lo que quiero que haga mi secuencia de comandos por lotes es recorrer las Folder 0subcarpetas " " y extraer todos los archivos ZIP que contienen en sus respectivas carpetas.

Es obligatorio que los archivos extraídos estén en la misma carpeta que sus respectivos archivos ZIP. Por lo tanto, los archivos contenidos en " File 1.zip" se necesitan en " Folder 1" y así sucesivamente.

He leído sobre elFOR...DOcomando encendidoWindows XP Professional Product Documentation - Using Batch Files.

Aquí está mi guión:

@ECHO OFF

FOR /D %folder IN (%%rootFolderCmdLnParam) DO 
    FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile

Supongo que también necesitaría cambiar el directorio real antes de llamar a 7za.exe y %zippedFile para la extracción de archivos, pero no puedo entender cómo en este archivo por lotes (sé cómo hacerlo en la línea de comando, e incluso si lo sé). es la misma instrucción "cd").

EDITAR #1

Las respuestas que se dan a continuación se acercan a lo que necesito. Pero por algunas razones desconocidas, a veces el archivo por lotes, cuando le doy un parámetro, simplemente no hace nada y me devuelve al mensaje.

No he escrito un archivo por lotes durante unos 15 años, así que me olvidé por completo de la lógica detrás, etc.

¿Alguien puede ayudar, por favor?

EDITAR #2

Parece, sin ninguna certeza, que el script del archivo por lotes no puede manejar nombres de carpetas con espacios. ¿Puede alguno de ustedes confirmar y proponer una solución para contrarrestar esto, por favor?

Me estoy quedando completamente ciego... ¡Gracias por tu ayuda! =)

EDITAR #3

Necesito que la solución sea completamente recursiva ya que no conozco la estructura de directorios en la que se utilizará. Perdón por no haberlo mencionado antes.

EDITAR #4

Todas sus respuestas y las de otros me han inspirado para llegar a lo siguiente (que funciona al 98%):

@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

El único problema que tengo es que quiere crear, siguiendo con mi ejemplo, File5una subcarpeta para extraer el archivo zip. Esto no supone ningún problema al extraer el File5.ziparchivo real. Pero cuando profundiza en la estructura de directorios de las subcarpetas, dado que obtuvo el último File5nombre de archivo, quiere crear la subcarpeta File5 en Folder 1\Folder A, por ejemplo, para extraer el archivo File1.zip. A continuación se muestra un ejemplo de estructura:


║═════ Folder 1
║         ║
║         ║══════ Folder A
║                     ║
║                     ║═════ File1.zip
║═════ Folder 5
          ║═════ File5.zip

Entonces, considerando la estructura ilustrada arriba, quiere crear File5en Folder A, cuando debería intentar crear File1en su lugar.

¡Gracias por su apoyo y ayuda! =)

Se agradece la ayuda de cualquiera.

EDITAR #5

He aceptado la respuesta de @Dennis Williamson ya que su solución cumple con lo que pedí en primer lugar. De lo contrario, si busca una solución totalmente recursiva, siga el enlace proporcionado en mi propia respuesta, que lo llevará al sitio web de StackOverflow.

Respuesta1

Puedes usar PUSHDy POPD:

@echo off
set rootFolderCmdLnParam=%1
FOR /D %%d IN (%rootFolderCmdLnParam%\*) DO pushd %%d & (FOR %%z IN (*.zip) DO 7za.exe e "%%z") & popd 

Llama así:

BatchScript.bat "c:\temp\usd\Folder 0"

Respuesta2

Aquí hay un script .CMD de Windows que podría ayudarlo un poco.

No es una solución completa, pero espero que al menos obtengas algunas ideas.

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

Respuesta3

También puedes usar FORFILES. EXE con el modificador /S. Esto también se encuentra en el kit de recursos.

Respuesta4

La respuesta proporcionada por @aphoria siguiendo el enlace a continuación permite que el script sea completamente recursivo, cree una subcarpeta con el mismo nombre del archivo zip, etc.

Aquí está el enlace a la respuesta a la misma pregunta en StackOverflow

Gracias a todos, me habéis ayudado mucho.

información relacionada