Batch file 在批处理文件中遍历文件夹和文件?

Batch file 在批处理文件中遍历文件夹和文件?,batch-file,dos,extract,7zip,Batch File,Dos,Extract,7zip,这是我的情况。项目的目标是将某些附件迁移到另一个系统 这些附件将位于父文件夹中,比如“文件夹0”(请参阅以便更好地理解),它们将被压缩/压缩 我希望我的批处理脚本的调用方式如下: BatchScript.bat "c:\temp\usd\Folder 0" 我正在使用7za.exe作为命令行提取工具 我想要我的批处理脚本做的是迭代“文件夹0”的子文件夹,并将所有包含的ZIP文件解压缩到各自的文件夹中 必须将提取的文件与其各自的ZIP文件放在同一文件夹中。因此,“文件夹1”等中需要“文件1.zi

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

这些附件将位于父文件夹中,比如“
文件夹0
”(请参阅以便更好地理解),它们将被压缩/压缩

我希望我的批处理脚本的调用方式如下:

BatchScript.bat "c:\temp\usd\Folder 0"
我正在使用
7za.exe
作为命令行提取工具

我想要我的批处理脚本做的是迭代“
文件夹0
”的子文件夹,并将所有包含的ZIP文件解压缩到各自的文件夹中

必须将提取的文件与其各自的ZIP文件放在同一文件夹中。因此,“
文件夹1
”等中需要“
文件1.zip
”中包含的文件

我已经读过关于上的命令

这是我的剧本:

@ECHO OFF

FOR /D %folder IN (%%rootFolderCmdLnParam) DO 
    FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile
我想在调用7za.exe e%zippedFile进行文件提取之前,我还需要更改实际目录,但我不知道如何在这个批处理文件中进行提取(通过我在命令行中知道如何进行,即使我知道它是同一条指令“cd”)

编辑#1

我已经收到了一些关于同一问题的提示。请看下面的答案

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

有人有主意吗

编辑#2

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

编辑#3

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

编辑#4.a

有了@aphoria的解决方案,我就快到了!唯一的问题是,我们假设
File5.zip
,检索文件名只获取
File5
,创建一个子文件夹
File5
,并将
File5.zip
提取到
File5
子文件夹,然后,它想在
文件夹1
中创建一个子文件夹
File5
,它应该在其中创建
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
@echo关闭
setlocal enableextensions enabledelayedexpansion
雷姆
未给出参数时,rem显示指令。
雷姆
如果“%1”等于(
回声句法:od.bat^^
回声示例:od.bat*
后藤:Eof
)
雷姆
rem设置此批处理文件的PATH环境变量以访问7za.exe。
雷姆
路径=c:\temp;%路径%
雷姆
rem从给定的命令行参数路径中删除引号。
雷姆
设置根=%1
设置根=%root:~%1
集合根=%root:~0,-1%
rem从根目录搜索目录结构中的子文件夹和zipfile,然后将zipfile提取到与zipfile同名的子文件夹中。
对于('dir/ogne/ad/b/s%root%')中的/F“delims==”%%d,请执行以下操作(
回音文件记录:“%%d”
对于/F“delims==”%%F in('dir/b“%%d\*.zip“'),请执行以下操作(
rem正在获取不带扩展名的文件名。
设置子文件夹=~n%f
mkdir“%%d\%子文件夹%”
rem正在将zipfile内容提取到新创建的文件夹中。
7za.exe e“%%d\%%f”-o“%%d\%子文件夹%”
)
)
:Eof
端部
有人吗

我的猜测是,它一次挖掘一个目录层次结构。事情是这样的。考虑在代码<文件夹> 1 /代码>(文件夹1 \文件夹A)中有一个<代码>文件夹< <代码>,然后从<代码>文件夹1 < /代码>通过<代码>文件夹5 < /代码>,并返回到<代码>文件夹1 \文件夹A/<代码>,其中%子文件夹%变量以其最后的值粘贴。


非常感谢任何人的帮助。

我对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  

更新 下面的代码将
文件夹A\File 1.zip
解压缩到新文件夹
文件夹A\File 1

需要记住的几件事:

  • 在第一个
    FOR
    循环中,需要将
    %ROOT%
    括在双引号中,以处理名称中带有空格的文件夹
  • 由于您正在为设置第二个
    内的变量,因此需要将
    SETLOCAL ENABLEDELAYEDEXPANSION
    放在开头。然后,使用!(例如,
    !subfolder!
    )在运行时强制展开
  • 这行代码
    set子文件夹=~n%f
    应该是这
    set子文件夹=%%~nf
  • 我将
    ECHO
    放在
    MKDIR
    7za.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
    

    谢谢你的回答!=)现在,要使您的解决方案完全递归,我应该怎么做?我们就快到了!感谢您和提供的解决方案!=)我现在要处理的唯一一件事是:>它总是希望在任何需要提取zipfile的地方创建相同的子文件夹。查看我的编辑。=)我不确定我是否完全理解。你能用你目前的代码更新这个问题吗?@aphoria:请在EDIT#4.b中查看我的代码。谢谢你的帮助!=)@aphoria:我刚刚编辑了你的答案,以说明我所做的微小更改:
    -o“%%d\!subfolder!”
    ,而不是
    -o“%%d\%subfolder%”