내 상황은 다음과 같습니다. 프로젝트의 목표는 일부 첨부 파일을 다른 시스템으로 마이그레이션하는 것입니다.
이러한 첨부 파일은 상위 폴더(예: " Folder 0
")에 위치합니다(참조:이 질문의 다이어그램이해를 돕기 위해) 압축/압축됩니다.
내 배치 스크립트를 다음과 같이 호출하고 싶습니다.
BatchScript.bat "c:\temp\usd\Folder 0"
저는 7za.exe
명령줄 추출 도구로 사용하고 있습니다.
배치 스크립트에서 수행하려는 작업은 " "의 하위 폴더를 반복 Folder 0
하고 포함된 모든 ZIP 파일을 해당 폴더에 추출하는 것입니다.
추출된 파일은 해당 ZIP 파일과 동일한 폴더에 있어야 합니다. 따라서 " "에 포함된 파일은 " " 등에 File 1.zip
필요합니다 .Folder 1
나는 다음에 대해 읽었습니다.FOR...DO
명령을 내리다Windows XP Professional Product Documentation - Using Batch Files
.
내 스크립트는 다음과 같습니다.
@ECHO OFF
FOR /D %folder IN (%%rootFolderCmdLnParam) DO
FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile
파일 추출을 위해 7za.exe e %zippedFile을 호출하기 전에 실제 디렉터리를 변경해야 할 것 같지만 이 배치 파일에서 어떻게 하는지 알 수 없습니다(명령줄에서 방법을 알고 있음에도 불구하고). 이는 동일한 명령 "cd"입니다).
편집 #1
아래에 제공된 답변은 모두 내가 필요한 답변에 가깝습니다. 그러나 몇 가지 알 수 없는 이유로 매개 변수를 제공하면 배치 파일이 아무 작업도 수행하지 않고 다시 프롬프트로 돌아가는 경우가 있습니다.
저는 약 15년 동안 배치 파일을 작성하지 않았기 때문에 그 뒤에 숨어 있는 논리 등을 완전히 잊어버렸습니다.
누군가 도와줄 수 있나요?
편집 #2
확실하지 않지만 배치 파일 스크립트는 공백 문자가 포함된 폴더 이름을 처리할 수 없는 것 같습니다. 이 카운터에 대한 솔루션을 확인하고 제안해 주실 수 있나요?
나는 여기서 완전히 눈이 멀게 될 것입니다... 도와주셔서 감사합니다! =)
편집 #3
이것이 사용될 디렉토리 구조를 모르기 때문에 완전히 재귀적인 솔루션이 필요합니다. 이전에 언급하지 않아서 죄송합니다.
편집 #4
나는 귀하의 모든 답변과 다른 사람들의 답변에서 영감을 받아 다음을 생각해냈습니다(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
내가 겪는 유일한 문제는 File5
zip 파일을 추출하기 위해 내 예를 고수하기 위해 하위 폴더를 만들고 싶어한다는 것입니다. 실제 파일을 추출할 때는 문제가 되지 않습니다 File5.zip
. 그러나 디렉토리 구조에서 하위 폴더까지 더 깊이 파고들면 마지막 File5
파일 이름을 얻었으므로 Folder 1\Folder A
예를 들어 File1.zip
. 다음은 구조의 예입니다.
║
║═════ Folder 1
║ ║
║ ║══════ Folder A
║ ║
║ ║═════ File1.zip
║
║═════ Folder 5
║
║═════ File5.zip
따라서 위 그림의 구조를 고려하여 대신 생성해야 할 경우 File5
에서 생성하려고 합니다 .Folder A
File1
귀하의 지원과 도움에 감사드립니다! =)
누구든지 도움을 주시면 감사하겠습니다.
편집 #5
@Dennis Williamson의 솔루션이 내가 처음 요청한 내용을 충족하므로 @Dennis Williamson의 답변을 수락했습니다. 그렇지 않고 완전히 재귀적인 솔루션을 찾고 있다면 내 답변에 제공된 링크를 따라가면 StackOverflow 웹 사이트로 이동됩니다.
답변1
PUSHD
다음 을 사용할 수 있습니다 POPD
.
@echo off
set rootFolderCmdLnParam=%1
FOR /D %%d IN (%rootFolderCmdLnParam%\*) DO pushd %%d & (FOR %%z IN (*.zip) DO 7za.exe e "%%z") & popd
다음과 같이 전화하세요.
BatchScript.bat "c:\temp\usd\Folder 0"
답변2
다음은 약간의 도움이 될 수 있는 Windows .CMD 스크립트입니다.
완전한 해결책은 아니지만 최소한 몇 가지 아이디어를 얻을 수 있기를 바랍니다.
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
답변3
FORFILES를 사용할 수도 있습니다. /S 스위치를 사용하여 EXE를 실행합니다. 이는 리소스 키트에도 있습니다.
답변4
아래 링크에 이어 @aphoria가 제공한 답변을 통해 스크립트가 완전히 재귀적으로 작동하고 zip 파일과 동일한 이름의 하위 폴더를 생성할 수 있습니다.
StackOverflow의 동일한 질문에 대한 답변 링크는 다음과 같습니다.
모두들 덕분에 많은 도움을 받았습니다.