Iterando pastas e arquivos em arquivos em lote?

Iterando pastas e arquivos em arquivos em lote?

Aqui está minha situação. Um projeto tem como objetivo migrar alguns anexos para outro sistema.

Esses anexos estarão localizados em uma pasta pai, digamos " Folder 0" (vejadiagrama desta questãopara melhor compreensão), e eles serão compactados/compactados.

Quero que meu script em lote seja chamado assim:

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

Estou usando 7za.execomo ferramenta de extração de linha de comando.

O que eu quero que meu script em lote faça é percorrer as Folder 0subpastas " " e extrair todos os arquivos ZIP contidos em suas respectivas pastas.

É obrigatório que os arquivos extraídos estejam na mesma pasta dos respectivos arquivos ZIP. Portanto, os arquivos contidos em " File 1.zip" são necessários em " Folder 1" e assim por diante.

Eu li sobre oFOR...DOcomando ligadoWindows XP Professional Product Documentation - Using Batch Files.

Aqui está meu roteiro:

@ECHO OFF

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

Acho que também precisaria alterar o diretório real antes de chamar 7za.exe e%zippedFile para extração de arquivo, mas não consigo descobrir como neste arquivo em lote (por meio de sei como na linha de comando, e mesmo se eu sei é a mesma instrução "cd").

EDITAR #1

As respostas fornecidas abaixo estão próximas do que eu preciso. Mas, por alguns motivos desconhecidos, às vezes o arquivo em lote, quando dou um parâmetro, simplesmente não faz nada e me traz de volta ao prompt.

Não escrevo um arquivo em lote há cerca de 15 anos, então esqueci completamente a lógica por trás, etc.

Alguém pode ajudar, por favor?

EDITAR #2

Parece, sem qualquer certeza, que o script do arquivo em lote não consegue lidar com nomes de pastas com caracteres de espaço. Um de vocês pode confirmar e propor uma solução para combater isso, por favor?

Estou ficando completamente cego aqui... Obrigado pela ajuda! =)

EDITAR #3

Preciso que a solução seja totalmente recursiva, pois não conheço a estrutura de diretórios na qual isso será usado. Desculpe por não ter mencionado antes.

EDITAR #4

Fui inspirado por todas as suas respostas e outras para chegar ao seguinte (que funciona a 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

O único problema que tenho é que ele deseja criar, seguindo meu exemplo, File5uma subpasta para extrair o arquivo zip. Isso não é problema ao extrair o File5.ziparquivo real. Mas quando ele se aprofunda na estrutura de diretórios para subpastas, uma vez que obteve o último File5nome de arquivo, ele deseja criar a subpasta Arquivo5 em Folder 1\Folder A, por exemplo, para extrair File1.zip. Aqui está um exemplo de estrutura:


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

Portanto, considerando a estrutura ilustrada acima, ele deseja criar File5em Folder A, quando deveria pretender criar File1.

Obrigado pelo seu apoio e ajuda! =)

A ajuda de qualquer pessoa é apreciada com gratidão.

EDITAR #5

Aceitei a resposta de @Dennis Williamson, pois sua solução atende ao que perguntei em primeiro lugar. Caso contrário, se alguém estiver procurando uma solução totalmente recursiva, siga o link fornecido em minha própria resposta, que o levará ao site StackOverflow.

Responder1

Você pode usar PUSHDe POPD:

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

Ligue assim:

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

Responder2

Aqui está um script .CMD do Windows que pode ajudá-lo um pouco.

Não é uma solução completa, mas espero que pelo menos você tire algumas ideias dela.

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

Responder3

Você também pode usar FORFILES. EXE com a opção /S. Isso também está no Kit de Recursos.

Responder4

A resposta fornecida por @aphoraria seguindo o link abaixo permite que o script seja totalmente recursivo, crie uma subpasta com o mesmo nome do arquivo zip, etc.

Aqui está o link para a resposta à mesma pergunta no StackOverflow

Obrigado a todos, todos vocês me ajudaram muito.

informação relacionada