如何从文件夹的子文件夹中提取所有多卷RAR存档?

时间:2015-07-16 20:35:02

标签: batch-file archive extraction rar winrar

我搜索了一种在批量下载后解压缩多卷存档的方法。

我用.r下载文件夹?通过FTP监控程序将文件放入其中,并希望 WinRAR 进入源文件夹的第一个子文件夹并开始解压缩.r00,删除存档并将包含解压缩文件的文件夹移动到新位置。

然后批处理脚本应该使用下一个子文件夹再次启动此过程。

假设源文件夹C:\Users\unpack包含以下带文件的子文件夹:

  • 源文件夹
    • subfolder1
      • Archive1.r00
      • Archive1.r01
      • Archive1.r02
      • xxx.txt
    • subfolder2
      • Archive2.r00
      • Archive2.r01
      • yyy.txt
    • subfolder3
      • Archive3.r00
      • Archive3.r01
      • Archive3.r02
      • Archive3.r04
      • Archive3.r05
      • zzz.txt

我已经开始使用下面链接中的脚本执行此操作,但该脚本无法执行我想要的操作,因此我开始了一个新问题。

How to unpack all rar archives in all subfolders of a folder and then delete the archives?

上面链接中的脚本解压缩所有子文件夹中的所有文件,然后将文件夹及其文件移动到新位置。我希望脚本解压并移动源文件夹中子文件夹的子文件夹。

Edit.1

如果winrar已准备好使用第一个子文件夹,则源文件夹中的结构应如下所示:

  • 源文件夹
    • subfolder2
      • Archive2.r00
      • Archive2.r01
      • yyy.txt
    • subfolder3
      • Archive3.r00
      • Archive3.r01
      • Archive3.r02
      • Archive3.r04
      • Archive3.r05
      • zzz.txt

C:\Users\new-location中的文件和文件夹应如下所示:

  • 源文件夹
    • subfolder1
      • xxx.mp4
      • xxx.txt
    • subfolder2
      • yyy.mp4
      • yyy.txt
    • subfolder3
      • zzz.mp4
      • zzz.txt

1 个答案:

答案 0 :(得分:1)

此任务的可能批处理代码是:

@echo off
setlocal EnableDelayedExpansion
set "BaseSourceFolder=C:\Users\Unpack"
set "BaseTargetFolder=C:\Users\New-Location"
for /D %%D in ("%BaseSourceFolder%\*") do (
    set "TargetFolder=%BaseTargetFolder%\%%~nxD"
    if not exist "!TargetFolder!" md "!TargetFolder!"
    "%ProgramFiles%\WinRAR\Rar.exe" x -cfg- -idq -y "%%~fD\*.r??" "!TargetFolder!"
    if not errorlevel 1 (
        del /F /Q "%%~fD\*.r??"
        move /Y "%%~fD\*" "!TargetFolder!">nul 2>nul
        rd "%%~fD" 2>nul
    )
)
rem rd "%BaseSourceFolder%" 2>nul
endlocal
在命令提示符窗口中执行的

for /?显示带有参数/D的命令 for 的帮助,这意味着对于基本源文件夹中*匹配的每个目录。

首先,在循环中,目标文件夹名称是根据要处理的子文件夹的名称定义的。 %%~fD%%~nxD也由for /?解释,其中文件夹通常没有扩展名,因此%%~nD通常也足够了。

如果尚未存在,则创建此目标文件夹。

然后执行Rar.exe以将当前子文件夹中的多卷存档直接提取到定义的目标文件夹。

*.r??用于使此批处理文件适用于具有旧命名方案ArchiveName.r00ArchiveName.r01,...以及更好的命名方案{{1}的多卷存档},ArchiveName.part01.rar,...默认情况下由 WinRAR 版本5.21使用。 RAR 会在从匹配ArchiveName.part02.rar的列表中提取多卷存档时自动跳过已处理的存档文件。

评估*.r??的退出代码以确定是否发生任何错误。如果分配给 errorlevel 的退出代码低于1,则没有错误,并且执行 if 分支的3个命令,导致首先删除所有RAR存档文件。

当前子文件夹中的其余文件也会移动到当前目标文件夹,即文件夹结构示例中的Rar.exe文件。

由于当前子文件夹现在应为空,命令 rd 应该能够删除该目录。如果由于子文件夹仍然不为空而出现错误,则子文件夹将保留在基本源文件夹中。

如果一切正常但没有错误,则基本源文件夹为空。 for 循环之后的注释行也可用于删除空的基本源文件夹,但如果有任何失败,请保留该文件夹。