这是我的情况。 一个项目的目标是将一些附件迁移到另一个系统。
这些附件将位于一个父文件夹,让我们说“ Folder 0 ”(见这个问题的图更好的理解),他们将被压缩/压缩。
我希望我的批处理脚本像这样被调用:
BatchScript.bat "c:\temp\usd\Folder 0"
我使用7za.exe作为命令行提取工具。
我想要的批处理脚本是通过遍历“ Folder 0 ”的子文件夹,并提取所有包含ZIP文件到其各自的文件夹。
提取的文件必须与各自的ZIP文件位于同一个文件夹中。 因此,“ File 1.zip Folder 1 ”等需要包含在“ File 1.zip ”中的Folder 1 。
我已经阅读了Windows XP Professional Product Documentation - Using Batch Files的FOR...DO命令。
这是我的脚本:
@ECHO OFF FOR /D %folder IN (%%rootFolderCmdLnParam) DO FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile
我想我也需要改变实际目录之前调用7za.exe e%zippedFile文件提取,但我不明白如何在这个batch file(通过我知道如何在命令行,即使我知道它是相同的指令“CD”)。
编辑#1
以下给出的答案都接近我所需要的。 但是由于某些未知的原因,有时batch file,当我给一个参数,就是不会做任何事情,并带我回到提示。
我大约15年没有写一个batch file,所以我完全忘记了后面的逻辑等。
有人可以帮忙吗?
编辑#2
看起来,没有任何的确信,batch file脚本不能处理具有空格字符的文件夹名称。 请问您能否确认一个解决scheme?
我在这里完全失明…感谢您的帮助! =)
编辑#3
我需要的解决scheme是完全recursion的,因为我不知道这将被使用的目录结构。 对不起,没有提到过。
编辑#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
我唯一的麻烦是,它想创build,坚持我的例子, File5子文件夹,以提取zipfile文件。 提取实际的File5.zip文件时这没有问题。 但是,当它在目录结构中深入到子文件夹时,由于它已经获得了最后一个File5文件名,因此它希望将File5子Folder 1\Folder A创build到Folder 1\Folder A ,例如提取File1.zip 。 这是一个结构的例子:
║ ║═════ Folder 1 ║ ║ ║ ║══════ Folder A ║ ║ ║ ║═════ File1.zip ║ ║═════ Folder 5 ║ ║═════ File5.zip
所以,考虑到上面所说明的结构,它希望在Folder A创buildFile5 ,而当它打算创buildFile5时。
感谢您的支持和帮助! =)
感谢任何人的帮助。
编辑#5
我已经接受了丹尼斯·威廉姆森的答案,因为他的解决scheme实现了我首先提出的要求。 否则,如果你正在寻找一个完全recursion的解决scheme,请按照我自己的答案提供的链接,这将带你到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脚本,可能会帮助你一点。
这不是一个完整的解决scheme,但我希望你至less从中得到一些想法。
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
你也可以使用FORFILES。 EX /与/ S开关。 这也在资源工具包中。
@aphoria提供的答案在下面的链接之后允许脚本完全recursion,创build与zipfile同名的子文件夹,等等。
这里是对StackOverflow的同一个问题的答案的链接
感谢大家,你们都帮助了我很多。