バッチファイル内のフォルダーとファイルを反復処理しますか?

バッチファイル内のフォルダーとファイルを反復処理しますか?

私の状況は次のとおりです。プロジェクトの目的は、いくつかの添付ファイルを別のシステムに移行することです。

これらの添付ファイルは親フォルダに配置されます。たとえば、「Folder 0」です(この質問の図(理解しやすいように)ZIP形式に圧縮されます。

バッチ スクリプトを次のように呼び出すようにします。

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に File5 サブフォルダーを作成しようとします。構造の例を次に示します。Folder 1\Folder AFile1.zip


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

したがって、上に示した構造を考慮すると、ではなくを作成するように意図するべきときにFile5で を作成しようとします。Folder AFile1

ご支援とご協力ありがとうございます! =)

どなたかのご協力を心より感謝いたします。

編集#5

@Dennis Williamson の回答は、私が最初に尋ねた内容を満たしているため、これを受け入れました。それ以外の場合、完全に再帰的なソリューションを探している場合は、私の回答に記載されているリンクをたどってください。このリンクから StackOverflow Web サイトに移動できます。

答え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

/S スイッチ付きの FORFILES.EXE を使用することもできます。これもリソース キットに含まれています。

答え4

以下のリンクに従って @aphoria が提供した回答では、スクリプトを完全に再帰的に実行し、zip ファイルと同じ名前のサブフォルダーなどを作成できます。

StackOverflowの同じ質問に対する回答へのリンクはこちらです

皆さんのおかげで、たくさん助けられました。

関連情報