通过批处理文件中的文件夹和文件进行迭代?

时间:2010-06-08 17:19:56

标签: batch-file dos extract 7zip

这是我的情况。项目的目标是将一些附件迁移到另一个系统。

这些附件将位于父文件夹中,让我们说“Folder 0”(有关更好的理解,请参阅this question's diagram),它们将被压缩/压缩。

我希望像这样调用我的批处理脚本:

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

我已经收到ServerFault对同一问题的一些提示。请在this link处查看答案。

但是,它是从根(C :)中提取的,而不是从参数文件夹中的给定中提取的。

有人有想法吗?

编辑#2

批处理脚本似乎不能充分处理包含空格字符的文件夹和文件名。谁能证实我的想法?

编辑#3

  

我需要它完全递归,因为我不知道将使用它的目录结构。

编辑#4.a

  

借助@ aphoria的解决方案,我几乎就在那里!唯一的问题是它需要说File5.zip,只检索文件名以获取File5,创建子文件夹File5并将File5.zip提取到File5子文件夹,然后,它想在File5中创建一个Folder 1子文件夹,而应该创建File1子文件夹,以坚持我的示例。

编辑#4.b

根据需要,这是目前的代码:

@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

想点什么?

我的猜测是它一次挖掘一个目录层次结构。这是交易。考虑我们在Folder A(文件夹1 \文件夹A)中有Folder 1,然后从Folder 1Folder 5进行搜索,然后返回Folder 1\Folder A,其中%子文件夹%变量与其最后一个值一致。

感谢任何人的帮助。

1 个答案:

答案 0 :(得分:8)

我对7zip命令行选项不是很熟悉,所以你需要找出确切的命令,但下面的脚本将采用一个完全指定的路径(允许空格)并打印出该文件夹包含在其中的名称和.zip文件。

@ECHO OFF

REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%

FOR /F "DELIMS==" %%d in ('DIR "%ROOT%" /AD /B') DO ( 
  ECHO %%d
  FOR /F "DELIMS==" %%f in ('DIR "%ROOT%\%%d\*.zip" /B') DO (
    ECHO   %%f
  )
)  


像这样运行:

MyScript.CMD "c:\temp\usd\Folder 0"

您应该得到与此类似的输出:

Folder A
  File 1.zip
  File 2.zip
Folder B
  File 1.zip
  File 2.zip  


更新

以下代码会将Folder A\File 1.zip提取到新文件夹Folder A\File 1

要记住的一些事项:

  1. 在第一个FOR循环中,您需要将%ROOT%括在双引号中以处理名称中带有空格的文件夹。
  2. 由于您在第二个SETFOR变量,因此您需要将SETLOCAL ENABLEDELAYEDEXPANSION放在开头。然后,使用引用变量! (例如,!subfolder!)在运行时强制扩展。
  3. 您的代码set subfolder=~n%f的这一行应为此set subfolder=%%~nf
  4. 我将ECHO放在MKDIR7za.exe命令前面进行测试。一旦确定它正在执行您想要的操作,请删除ECHO语句。
  5. 以下是代码:

    @ECHO OFF
    
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    REM
    REM Remove the double quotes from the front and end of the root path
    REM
    SET ROOT=%1
    SET ROOT=%ROOT:~1%
    SET ROOT=%ROOT:~0,-1%
    ECHO %ROOT%
    
    REM Searching directory structure from root for subfolders and zipfiles,
    REM 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=%%~nf
            ECHO mkdir "%%d\!subfolder!"
            REM Extracting zipfile content to the newly created folder.
            ECHO 7za.exe e "%%d\%%f" -o"%%d\!subfolder!"
        )
    )
    
    ENDLOCAL