這是我的情況。專案的目標是將一些附件遷移到另一個系統。
這些附件將位於父資料夾中,比方說「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
您可以使用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。 EXE 附 /S 開關。這也在資源工具包中。