如何从文件夹的子文件夹中提取所有多卷 RAR 档案?
How to extract all multi-volume RAR archives from subfolders of a folder?
我正在寻找一种批量下载后解压多卷档案的方法。
我用 .r 下载文件夹?通过 FTP 监控程序将文件放入其中,并希望 WinRAR 进入源文件夹中的第一个子文件夹并开始解压 .r00,删除存档并移动文件夹将文件解压到新位置。
然后批处理脚本应该对下一个子文件夹再次开始这个过程。
假设源文件夹 C:\Users\unpack
包含以下带有文件的子文件夹:
- 源文件夹
- 子文件夹1
- Archive1.r00
- Archive1.r01
- Archive1.r02
- xxx.txt
- 子文件夹2
- Archive2.r00
- Archive2.r01
- yyy.txt
- 子文件夹3
- Archive3.r00
- Archive3.r01
- Archive3.r02
- Archive3.r04
- Archive3.r05
- zzz.txt
我已经开始用下面link中的脚本来做这个,但是那个脚本不能做我想做的,所以我开始了一个新问题。
上面 link 中的脚本解压缩所有子文件夹中的所有文件,然后将文件夹及其文件移动到新位置。我希望脚本解压缩并移动源文件夹中子文件夹的子文件夹。
编辑.1
如果 winrar 已准备好第一个子文件夹,则源文件夹中的结构应如下所示:
- 源文件夹
- 子文件夹2
- Archive2.r00
- Archive2.r01
- yyy.txt
- 子文件夹3
- Archive3.r00
- Archive3.r01
- Archive3.r02
- Archive3.r04
- Archive3.r05
- zzz.txt
C:\Users\new-location
中的文件和文件夹应如下所示:
- 源文件夹
- 子文件夹1
- xxx.mp4
- xxx.txt
- 子文件夹2
- yyy.mp4
- yyy.txt
- 子文件夹3
- zzz.mp4
- zzz.txt
此任务可能的批处理代码是:
@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.r00
、ArchiveName.r01
、...以及更好的命名方案 ArchiveName.part01.rar
, ArchiveName.part02.rar
, ... WinRAR 5.21 版默认使用。 RAR 自动跳过在从匹配 *.r??
.
的列表中提取多卷存档期间已经处理的存档文件
评估 Rar.exe
的退出代码以确定是否发生任何错误。如果分配给 errorlevel 的退出代码低于 1,则没有错误并且执行 if 分支的 3 个命令导致首先删除所有RAR 存档文件。
当前子文件夹中的剩余文件也移动到当前目标文件夹,即文件夹结构示例中的*.txt
文件。
由于当前子文件夹现在应该是空的,命令rd应该可以删除该目录。如果由于子文件夹仍不为空而出错,子文件夹将保留在基本源文件夹中。
如果一切正常,基本源文件夹为空。 for 循环后的注释行也可用于删除空的基本源文件夹,但如果失败则保留该文件夹。
我正在寻找一种批量下载后解压多卷档案的方法。
我用 .r 下载文件夹?通过 FTP 监控程序将文件放入其中,并希望 WinRAR 进入源文件夹中的第一个子文件夹并开始解压 .r00,删除存档并移动文件夹将文件解压到新位置。
然后批处理脚本应该对下一个子文件夹再次开始这个过程。
假设源文件夹 C:\Users\unpack
包含以下带有文件的子文件夹:
- 源文件夹
- 子文件夹1
- Archive1.r00
- Archive1.r01
- Archive1.r02
- xxx.txt
- 子文件夹2
- Archive2.r00
- Archive2.r01
- yyy.txt
- 子文件夹3
- Archive3.r00
- Archive3.r01
- Archive3.r02
- Archive3.r04
- Archive3.r05
- zzz.txt
- 子文件夹1
我已经开始用下面link中的脚本来做这个,但是那个脚本不能做我想做的,所以我开始了一个新问题。
上面 link 中的脚本解压缩所有子文件夹中的所有文件,然后将文件夹及其文件移动到新位置。我希望脚本解压缩并移动源文件夹中子文件夹的子文件夹。
编辑.1
如果 winrar 已准备好第一个子文件夹,则源文件夹中的结构应如下所示:
- 源文件夹
- 子文件夹2
- Archive2.r00
- Archive2.r01
- yyy.txt
- 子文件夹3
- Archive3.r00
- Archive3.r01
- Archive3.r02
- Archive3.r04
- Archive3.r05
- zzz.txt
- 子文件夹2
C:\Users\new-location
中的文件和文件夹应如下所示:
- 源文件夹
- 子文件夹1
- xxx.mp4
- xxx.txt
- 子文件夹2
- yyy.mp4
- yyy.txt
- 子文件夹3
- zzz.mp4
- zzz.txt
- 子文件夹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 /?
在命令提示符下执行 window 显示命令 for 的帮助,参数 /D
表示每个目录匹配 *
在基本源文件夹中。
在循环中,首先根据要处理的子文件夹的名称定义目标文件夹名称。 %%~fD
和 %%~nxD
也由 for /?
解释,其中文件夹通常没有扩展名,因此 %%~nD
通常也足够了。
接下来创建此目标文件夹(如果尚不存在)。
然后执行Rar.exe
将当前子文件夹中的多卷压缩包直接解压到定义的目标文件夹。
*.r??
用于使此批处理文件适用于具有旧命名方案 ArchiveName.r00
、ArchiveName.r01
、...以及更好的命名方案 ArchiveName.part01.rar
, ArchiveName.part02.rar
, ... WinRAR 5.21 版默认使用。 RAR 自动跳过在从匹配 *.r??
.
评估 Rar.exe
的退出代码以确定是否发生任何错误。如果分配给 errorlevel 的退出代码低于 1,则没有错误并且执行 if 分支的 3 个命令导致首先删除所有RAR 存档文件。
当前子文件夹中的剩余文件也移动到当前目标文件夹,即文件夹结构示例中的*.txt
文件。
由于当前子文件夹现在应该是空的,命令rd应该可以删除该目录。如果由于子文件夹仍不为空而出错,子文件夹将保留在基本源文件夹中。
如果一切正常,基本源文件夹为空。 for 循环后的注释行也可用于删除空的基本源文件夹,但如果失败则保留该文件夹。