【问题标题】:Iterating through folders and files in batch file?遍历批处理文件中的文件夹和文件?
【发布时间】:2010-06-08 17:19:55
【问题描述】:

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

这些附件将位于父文件夹中,比如“Folder 0”(请参阅​​this question's diagram 以更好地理解),它们将被压缩/压缩。

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

BatchScript.bat "c:\temp\usd\Folder 0"

我使用7za.exe作为命令行提取工具。

我希望我的批处理脚本做的是遍历“Folder 0”的子文件夹,并将所有包含的 ZIP 文件提取到各自的文件夹中。

提取的文件必须与其各自的 ZIP 文件位于同一文件夹中。因此,“Folder 1”中需要“File 1.zip”中包含的文件,依此类推。

我已经阅读了关于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 进行文件提取之前,我还需要更改实际目录,但我无法弄清楚这个批处理文件的方式(通过我知道命令行中的方式,甚至如果我知道它是相同的指令“cd”)。

编辑#1

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

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

有人有想法吗?

编辑#2

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

编辑#3

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

编辑 #4.a

有了@aphoria 的解决方案,我就快到了!唯一的问题是它需要假设File5.zip,仅检索文件名以获得File5,创建一个子文件夹File5并将File5.zip提取到File5子文件夹,然后,它想创建一个@987654341 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 1(文件夹 1\文件夹 A)中有一个 Folder A,然后,它从 Folder 1Folder 5 搜索,然后返回到 Folder 1\Folder A,其中 %subfolder% 变量与其最后一个价值。

感谢任何人的帮助。

【问题讨论】:

    标签: batch-file dos extract 7zip


    【解决方案1】:

    我对 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. 由于您在第二个FOR 中添加了SET 变量,因此您需要将SETLOCAL ENABLEDELAYEDEXPANSION 放在开头。然后,使用 ! 引用变量(例如,!subfolder!)在运行时强制扩展。
    3. 这行代码set subfolder=~n%f应该是set subfolder=%%~nf
    4. 我将ECHO 放在MKDIR7za.exe 命令的前面进行测试。一旦您确定它正在执行您想要的操作,请删除 ECHO 语句。

    代码如下:

    @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
    

    【讨论】:

    • 感谢您的回答! =) 现在,要使您的解决方案完全递归,我应该怎么做?
    • 我们快到了!感谢您和提供的解决方案! =) 我现在唯一需要处理的是: > 它总是希望在必须提取 zip 文件的任何地方创建相同的子文件夹。请参阅我的编辑。 =)
    • 我不确定我是否完全理解。您可以使用当前的代码更新问题吗?
    • @aphoria:请在 EDIT #4.b 中查看我的代码。谢谢你的帮助! =)
    • @aphoria:我刚刚编辑了您的答案以说明我所做的微小更改:-o"%%d\!subfolder!",而不是 -o"%%d\%subfolder%"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多