遍歷批處理文件中的文件夾和文件?
這是我的情況。一個項目的目標是將一些附件遷移到另一個系統。
這些附件將位於父文件夾中,比如說“
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 A
到File1.zip
. 下面是一個結構範例:║ ║═════ Folder 1 ║ ║ ║ ║══════ Folder A ║ ║ ║ ║═════ File1.zip ║ ║═════ Folder 5 ║ ║═════ File5.zip
因此,考慮到上述結構,它想要創建
File5
inFolder A
,而它應該打算創建File1
。感謝您的支持和幫助!=)
感謝任何人的幫助。
編輯#5
我接受了@Dennis Williamson 的回答,因為他的解決方案滿足了我首先提出的要求。否則,如果您正在尋找完全遞歸的解決方案,請按照我自己的答案中提供的連結進行操作,該連結將帶您訪問 StackOverflow 網站。
您可以使用
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"
這是一個 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