배치 파일의 폴더와 파일을 반복하시겠습니까?

배치 파일의 폴더와 파일을 반복하시겠습니까?

내 상황은 다음과 같습니다. 프로젝트의 목표는 일부 첨부 파일을 다른 시스템으로 마이그레이션하는 것입니다.

이러한 첨부 파일은 상위 폴더(예: " 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

내가 겪는 유일한 문제는 File5zip 파일을 추출하기 위해 내 예를 고수하기 위해 하위 폴더를 만들고 싶어한다는 것입니다. 실제 파일을 추출할 때는 문제가 되지 않습니다 File5.zip. 그러나 디렉토리 구조에서 하위 폴더까지 더 깊이 파고들면 마지막 File5파일 이름을 얻었으므로 Folder 1\Folder A예를 들어 File1.zip. 다음은 구조의 예입니다.


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

따라서 위 그림의 구조를 고려하여 대신 생성해야 할 경우 File5에서 생성하려고 합니다 .Folder AFile1

귀하의 지원과 도움에 감사드립니다! =)

누구든지 도움을 주시면 감사하겠습니다.

편집 #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의 동일한 질문에 대한 답변 링크는 다음과 같습니다.

모두들 덕분에 많은 도움을 받았습니다.

관련 정보