Batch-File

遍歷批處理文件中的文件夾和文件?

  • June 9, 2010

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

這些附件將位於父文件夾中,比如說“ 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子文件夾,以將 zipfile 提取到其中。File5.zip提取實際文件時,這沒有問題。但是當它深入到子文件夾的目錄結構中時,由於它已經獲得了最後一個File5文件名,所以它想將 File5 子文件夾創建Folder 1\Folder AFile1.zip. 下面是一個結構範例:

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

因此,考慮到上述結構,它想要創建File5in Folder A,而它應該打算創建File1

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

感謝任何人的幫助。

編輯#5

我接受了@Dennis Williamson 的回答,因為他的解決方案滿足了我首先提出的要求。否則,如果您正在尋找完全遞歸的解決方案,請按照我自己的答案中提供的連結進行操作,該連結將帶您訪問 StackOverflow 網站。

您可以使用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"

這是一個 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

引用自:https://serverfault.com/questions/149317