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.exe
como ferramenta de extração de linha de comando.
O que eu quero que meu script em lote faça é percorrer as Folder 0
subpastas " " 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...DO
comando 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, File5
uma subpasta para extrair o arquivo zip. Isso não é problema ao extrair o File5.zip
arquivo real. Mas quando ele se aprofunda na estrutura de diretórios para subpastas, uma vez que obteve o último File5
nome 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 File5
em 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 PUSHD
e 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.