Windows 解压所有子文件夹中的所有zip文件

Windows 解压所有子文件夹中的所有zip文件,windows,batch-file,cmd,directory,Windows,Batch File,Cmd,Directory,使用cmd批处理文件如何迭代目录中的所有文件夹并解压缩每个文件夹中的所有zip文件?我已经能够遍历所有的子文件夹,但是我不能遍历每个子文件夹 FOR /D %%R IN ("*") DO FOR /D %%S IN (*/%RR) unzip %%S 文件夹结构 folder\subfolder1\zip1 folder\subfolder2\zip2 folder\subfolder3\zip3 folder\subfolder4\zip4 我想有每个zipfile的内容提取在它包含文件夹

使用cmd批处理文件如何迭代目录中的所有文件夹并解压缩每个文件夹中的所有zip文件?我已经能够遍历所有的子文件夹,但是我不能遍历每个子文件夹

FOR /D %%R IN ("*") DO FOR /D %%S IN (*/%RR) unzip %%S
文件夹结构

folder\subfolder1\zip1
folder\subfolder2\zip2
folder\subfolder3\zip3
folder\subfolder4\zip4
我想有每个zipfile的内容提取在它包含文件夹。zip文件和子文件夹具有不同的名称。

请尝试使用:

for/d%%r in(*)do for%%s in(“%%r\*.zip”)do echo---使用输出文件夹%%dps解压%%s


我假设您示例中的zip1文件是zip1.zip,并且每个子文件夹中可能有更多的zip文件。但如果不是,这也适用于一个zip文件。在脚本的底部有一个可选的zip文件w/o.zip

这些文件是我用来测试的。“子文件夹”中有一个专门的空格,因为根据带有空格的路径名测试批处理脚本总是很好的

C:\temp\folder\sub folder1\zip1.zip
C:\temp\folder\sub folder1\zip1b.zip
C:\temp\folder\subfolder2\zip2.zip
C:\temp\folder\subfolder2\zip2b.zip
C:\temp\folder\subfolder3\zip3.zip
C:\temp\folder\subfolder3\zip3b.zip
C:\temp\folder\subfolder4\zip4.zip
C:\temp\folder\subfolder4\zip4b.zip
解压不是windows命令。它可以来自许多来源,因此其参数的格式可能不同。在我的示例中,我使用的是7zip。
无论如何,您可能需要使用任何解压实用程序(或CD)指定输出目录。我的示例显示了如何获取其名称。末尾有一条斜线,这对于7z来说是可以的,但是对于其他实用程序可能会有问题。可以去掉它,但需要更多的代码

您要求将所有zip文件解压缩到其自己的目录中。但是,如果两个zip文件包含同名文件,它们将相互覆盖,这就是为什么可能更希望将每个zip文件解压缩到其自己的文件夹中,并使用与zip文件相同的名称。为此,必须创建文件夹,并且整个脚本应该不止一行

人们不信任for/d
这就是为什么我还为使用dir命令的/f版本添加了

在这种情况下,您可能希望更递归地使用此命令,并使用更深的路径,如:
folder\subfolder3\more\path\zip1.zip
,这是可能的。只需使用下面示例中的
for/f
,并将
/s
添加到
dir
命令中:
'dir*/s/ad/b'

此命令应执行您要求的操作:
for/d%%r in(*)do for%%s in(“%%r\*.zip”)do 7z x-y“%%s”-o”%%~dps”

下面是整个测试用例脚本:

@echo off

echo ******
echo List all zip files using for /f
echo ******
for /f "tokens=*" %%r in ('dir *.* /ad /b') do for %%s in ("%%r\*.zip") do echo ---unzip %%s using output folder %%~dps

echo.
echo ******
echo List all zip files using for /d
echo ******
for /d %%r in (*) do for %%s in ("%%r\*.zip") do echo ---unzip %%s using output folder %%~dps

echo.
echo 1: extract to folders containing zip files - possible overwrites
echo 2: extract each zip to a folder named by the name of the zip file
choice /c 12
if not errorlevel 2 (

    for /d %%r in (*) do for %%s in ("%%r\*.zip") do 7z x -y "%%s" -o"%%~dps"

) else (

rem ------ this is the alternative to extract each zip to its own folder
    for /d %%r in (*) do for %%s in ("%%r\*.zip") do (
        echo.
        echo ******
        echo *** Unzipping: %%s to folder: %%~dpns
        mkdir "%%~dpns"
        7z x -y "%%s" -o"%%~dpns"
    )
rem ------

)
pause

exit /b

In case zip files does not have .zip extension:

    for /d %%r in (*) do for %%s in ("%%r\*.*") do (
        echo.
        echo ******
        echo *** Unzipping: %%s to folder: %%~dpns-unzipped
        mkdir "%%~dpns-unzipped"
        7z x -y "%%s" -o"%%~dpns-unzipped"
    )

unzip
不是标准的windows命令。它来自哪里?
(*/%RR)
无法工作。Windows命令解释器不支持路径中的通配符。缺少第二个百分号,这显然是一个键入错误,因为有两个
R
,而不是两个
%
。Windows上的目录分隔符是反斜杠字符,而不是斜杠字符。这么短的一行中有这么多错误。您是否曾经在命令提示符窗口中执行过/?并阅读过该命令的输出帮助?很好,我不知道该帮助命令,谢谢,我用该命令编辑了原始答案,只是为了改进问题,但我在批处理文件中粘贴了我上次尝试的内容,以摆弄这些命令。
cmd.exe
的每个内部命令都可以使用参数
/?
执行,以显示其帮助。您还可以运行命令
help
,以获取命令列表。Windows上的控制台应用程序通常也可以使用参数
/?
运行,以便在控制台中显示应用程序的简要帮助。仅从Unix移植的控制台应用程序需要
--help
-h
来显示帮助。顺便说一下:Windows中的标准路径分隔符是
\
,而不是
/
!这是输出,它的大约34个子文件夹
****B A T C H R E C U R S I O N超过堆栈限制*******递归计数=261,堆栈使用率=90%*******B A T C H处理是一个B O R T E D****
@Snickdx-错误表明有
261个
CALL
命令的嵌套调用。很难相信它是由我的答案中的代码生成的……很抱歉,我似乎误解了你的答案,我以为提供的代码应该放在一个批处理文件中,名为zipjs.bat,但我刚刚意识到它是指向真实脚本的链接。
@echo off

echo ******
echo List all zip files using for /f
echo ******
for /f "tokens=*" %%r in ('dir *.* /ad /b') do for %%s in ("%%r\*.zip") do echo ---unzip %%s using output folder %%~dps

echo.
echo ******
echo List all zip files using for /d
echo ******
for /d %%r in (*) do for %%s in ("%%r\*.zip") do echo ---unzip %%s using output folder %%~dps

echo.
echo 1: extract to folders containing zip files - possible overwrites
echo 2: extract each zip to a folder named by the name of the zip file
choice /c 12
if not errorlevel 2 (

    for /d %%r in (*) do for %%s in ("%%r\*.zip") do 7z x -y "%%s" -o"%%~dps"

) else (

rem ------ this is the alternative to extract each zip to its own folder
    for /d %%r in (*) do for %%s in ("%%r\*.zip") do (
        echo.
        echo ******
        echo *** Unzipping: %%s to folder: %%~dpns
        mkdir "%%~dpns"
        7z x -y "%%s" -o"%%~dpns"
    )
rem ------

)
pause

exit /b

In case zip files does not have .zip extension:

    for /d %%r in (*) do for %%s in ("%%r\*.*") do (
        echo.
        echo ******
        echo *** Unzipping: %%s to folder: %%~dpns-unzipped
        mkdir "%%~dpns-unzipped"
        7z x -y "%%s" -o"%%~dpns-unzipped"
    )