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

How to extract all multi-volume RAR archives from subfolders of a folder?

我正在寻找一种批量下载后解压多卷档案的方法。

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

然后批处理脚本应该对下一个子文件夹再次开始这个过程。

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

我已经开始用下面link中的脚本来做这个,但是那个脚本不能做我想做的,所以我开始了一个新问题。

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

编辑.1

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

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

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

@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 /? 在命令提示符下执行 window 显示命令 for 的帮助,参数 /D 表示每个目录匹配 * 在基本源文件夹中。

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

接下来创建此目标文件夹(如果尚不存在)。

然后执行Rar.exe将当前子文件夹中的多卷压缩包直接解压到定义的目标文件夹。

*.r?? 用于使此批处理文件适用于具有旧命名方案 ArchiveName.r00ArchiveName.r01、...以及更好的命名方案 ArchiveName.part01.rar, ArchiveName.part02.rar, ... WinRAR 5.21 版默认使用。 RAR 自动跳过在从匹配 *.r??.

的列表中提取多卷存档期间已经处理的存档文件

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

当前子文件夹中的剩余文件也移动到当前目标文件夹,即文件夹结构示例中的*.txt文件。

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

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