从多个文件夹中提取多个 .part 拆分档案

Extract multiple .part splitted archives from multiple folders

我在C:\test中有一些这样的分割档案

PARENT folder is C:\test
     |
     +--- subfolder1
             |         
             +-- file1.part01.rar
             +-- file1.part02.rar
             +-- file2.part01.rar
             +-- file2.part02.rar
             +.....

      +--- subfolder2
             |
             +-- file1.part1.rar
             +-- file1.part2.rar
             +-- file2.part1.rar
             +-- file2.part2.rar
             +......

我尝试用这种方式解压这些文件夹

PARENT folder is C:\test
     |
     +--- subfolder1
             |         
             +-- file1 [folder]
             +-- file2 [folder]
             +.....

      +--- subfolder2
             |
             +-- file1 [folder]
             +-- file2 [folder]
             +......

但是我失败了(批处理似乎没有开始)

@echo off
setlocal EnableExtensions DisableDelayedExpansion

for /F "tokens=2 delims=:" %%I in ('%SystemRoot%\System32\chcp.com') do set "CodePage=%%I"
%SystemRoot%\System32\chcp.com 65001 2>nul

set "PromptForBreak="
if /I "%~1" == "/noprompt" set "PromptForBreak=rem"

set "SourceFolder=C:\Test"
set "LogExtract=%SourceFolder%\ExtractionLog.txt"
set "LogError=%SourceFolder%\ErrorLog.txt"

del /Q "%LogExtract%" "%LogError%" 2>nul

for /F "eol=| delims=" %%I in ('dir "%SourceFolder%\*" /AD-H /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:done') do (
    set "NoFolderMove="
    for /F "eol=| delims=" %%J in ('dir "%SourceFolder%\%%I\*.rar" "%SourceFolder%\%%I\*.zip" /A-D-H /B /ON 2^>nul') do (
        if exist "%SourceFolder%\%%I\%%J" (
            echo Extracting "%SourceFolder%\%%I\%%J" ...
            "%ProgramFiles%\WinRAR\WinRAR.exe" x -cfg- -ibck -logpfu="%LogExtract%" -o+ -y -- "%SourceFolder%\%%I\%%J" "%SourceFolder%\%%I\"
            if errorlevel 1 (
                set "NoFolderMove=1"
                set "ArchiveFile=%SourceFolder%\%%I\%%J"
                >>"%LogError%" call echo Error %%ErrorLevel%% on extracting "%%ArchiveFile%%"
            ) else (
                echo %%~nJ| %SystemRoot%\System32\findstr.exe /I /R "\.part[0123456789][0123456789]*$" >nul
                if errorlevel 1 ( del /F "%SourceFolder%\%%I\%%J" ) else for %%# in ("%%~nJ") do del /F /Q "%SourceFolder%\%%I\%%~n#.part*%%~xJ"
            )
        )
    )
    if not defined NoFolderMove (
        md "%SourceFolder%\done" 2>nul
        if exist "%SourceFolder%\done\" move /Y "%SourceFolder%\%%I" "%SourceFolder%\done\" >nul
        %PromptForBreak% %SystemRoot%\System32\choice.exe /C NY /N /T 2 /D N /M "Break execution [N/Y]? "
        %PromptForBreak% if errorlevel 2 goto EndBatch
    )
)

:EndBatch
if defined CodePage %SystemRoot%\System32\chcp.com %CodePage%
endlocal

问题运行中的批处理文件代码没有任何错误。使用我自己创建的四个 multi-volume RAR 压缩包没有产生想要的目录树,但是在批处理文件执行过程中没有错误输出。

以下批处理文件可用于此任务,分别使用 WinRAR Rar.exe 版本 5.70 或支持开关 -ad1 的更新版本(必需) 和 -isnd- (不需要):

@echo off
setlocal EnableExtensions DisableDelayedExpansion
"%ProgramFiles%\WinRAR\Rar.exe" x -ad1 -cfg- -c- -idq -isnd- -o+ -r -y -- "C:\Test\*.rar"
if errorlevel 1 pause & exit /B
for /F "delims=" %%I in ('dir "C:\Test\*.part*" /AD /B /S 2^>nul') do (
    if exist "%%I\%%~nI\" (
        dir "%%I" /A /B | %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"%%~nI" | %SystemRoot%\System32\findstr.exe /R "^." >nul
        if errorlevel 1 (
            move "%%I\%%~nI" "%%~dpI" >nul
            if not errorlevel 1 (rd "%%I") else ren "%%I" "%%~nI"
        ) else ren "%%I" "%%~nI"
    ) else ren "%%I" "%%~nI"
)
del /A-R /Q /S "C:\Test\*.rar" >nul
endlocal

RAR命令xRAR开关在控制台版本[=的手册中都有描述89=]WinRAR是WinRAR程序文件目录下的文本文件Rar.txt。手册底部还包含可能的退出值及其含义。

也可以使用 UnRAR.exe 5.70 版或更新版本来提取 RAR 压缩文件,与共享软件 Rar.exe 相比,它是免费软件。 UnRAR.exe(Windows 的 UnRAR)可以从 WinRAR and RAR archiver addons 下载。

批处理文件在通过Rar.exe 命令PAUSE 递归找到的所有存档的提取过程中遇到任何错误时执行,以停止批处理文件的执行以查看错误消息然后退出批处理文件处理而不执行清理步骤。

目录C:\Test解压完成后可能有以下文件夹和文件:

  • 子文件夹1
    • file1.part01
      • 一个或多个提取的文件夹
      • 一个或多个提取的文件
    • file2.part1
      • 文件2
        • 一个或多个提取的文件夹
        • 一个或多个提取的文件
    • file1.part01.rar
    • file1.part02.rar
    • file2.part1.rar
    • file2.part2.rar
  • 子文件夹2
    • file3.part01
      • 一个或多个提取的文件夹
      • 一个或多个提取的文件
    • file4.part1
      • file4
        • 一个或多个提取的文件夹
        • 一个或多个提取的文件
      • 一个或多个额外的提取文件夹
      • 一个或多个额外的提取文件
    • file3.part01.rar
    • file3.part02.rar
    • file4.part1.rar
    • file4.part2.rar

不需要以.part01.part1结尾的目录名。因此,通过删除“扩展名”.part*.

来重命名与通配符模式 *.part* 匹配的目录

也可能有 multi-volume RAR 压缩文件,其中仅包含一个与 RAR 压缩文件同名的目录,该文件包含所有压缩目录和文件。在上面的示例中,file2.part? 就是这种情况,其中包含目录 file2 以及所有存档的目录和文件。对于这样的压缩文件,在 multi-volume RAR 压缩文件的目录中最好只有 file2 而不是 finally file2\file2。出于这个原因 file2.part1\file2 被移动到名称为 file2 的目录 subfolder1 并且现在空的目录 file2.part1 被批处理代码删除。

存档也可能包含与存档文件同名的目录,但另外还可能包含其他目录和文件,如 file4.part? 的情况。在这种情况下,不应进行目录移动,因为结果与存档中的结果不同。

最后,批处理文件删除了所有 RAR 压缩文件,但由于使用选项 /A-R 而设置了 read-only 属性的文件除外。这使得可以在具有 read-only 属性集的所有 *.rar 文件的同一目录结构上多次 运行 批处理文件,并且在每次执行之间删除由 Rar.exe 创建的目录批处理文件。

最后一个命令行也可以是:

del /A /F /Q /S "C:\Test\*.rar" >nul

该命令行实际上会删除 C:\Test 及其所有子目录中的所有 RAR 压缩文件。

这个批处理文件在C:\Test中的最终结果是:

  • 子文件夹1
    • 文件1
      • 一个或多个提取的文件夹
      • 一个或多个提取的文件
    • 文件2
      • 一个或多个提取的文件夹
      • 一个或多个提取的文件
  • 子文件夹2
    • file3
      • 一个或多个提取的文件夹
      • 一个或多个提取的文件
    • file4
      • file4
        • 一个或多个提取的文件夹
        • 一个或多个提取的文件
      • 一个或多个额外的提取文件夹
      • 一个或多个额外的提取文件

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • exit /?
  • findstr /?
  • for /?
  • if /?
  • move /?
  • pause /?
  • rd /?
  • ren /?
  • setlocal /?

阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul 的解释。重定向运算符 > 必须在 FOR 命令行上使用脱字符 ^ 进行转义,以便在 Windows 命令解释器处理此命令时将其解释为文字字符执行命令 FOR 之前的行,它在后台启动的单独命令进程中执行嵌入式 dir 命令行。