遍歷批次檔中的資料夾和檔案?

遍歷批次檔中的資料夾和檔案?

這是我的情況。專案的目標是將一些附件遷移到另一個系統。

這些附件將位於父資料夾中,比方說「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文件名,因此它想要在 中創建 File5 子資料夾Folder 1\Folder A,例如,以提取File1.zip.這是一個結構範例:


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

因此,考慮到上面所示的結構,它想要File5在 , 中創建Folder A,而實際上它應該打算創建File1

感謝您的支持與幫助! =)

非常感謝任何人的幫助。

編輯#5

我已經接受了@Dennis Williamson 的回答,因為他的解決方案滿足了我首先提出的要求。否則,如果您正在尋找完全遞歸的解決方案,請點擊我自己的答案中提供的鏈接,該鏈接會將您帶到 StackOverflow 網站。

答案1

您可以使用PUSHDPOPD

@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。 EXE 附 /S 開關。這也在資源工具包中。

答案4

@aphoria 在下面的連結之後提供的答案允許腳本完全遞歸,創建與 zip 檔案同名的子資料夾等。

這是 StackOverflow 上同一問題的答案的鏈接

感謝大家,你們給了我很多幫助。

相關內容