我搜索了一种在批量下载后解压缩多卷存档的方法。
我用.r下载文件夹?通过FTP监控程序将文件放入其中,并希望 WinRAR 进入源文件夹的第一个子文件夹并开始解压缩.r00,删除存档并将包含解压缩文件的文件夹移动到新位置。
然后批处理脚本应该使用下一个子文件夹再次启动此过程。
假设源文件夹C:\Users\unpack
包含以下带文件的子文件夹:
我已经开始使用下面链接中的脚本执行此操作,但该脚本无法执行我想要的操作,因此我开始了一个新问题。
How to unpack all rar archives in all subfolders of a folder and then delete the archives?
上面链接中的脚本解压缩所有子文件夹中的所有文件,然后将文件夹及其文件移动到新位置。我希望脚本解压并移动源文件夹中子文件夹的子文件夹。
Edit.1
如果winrar已准备好使用第一个子文件夹,则源文件夹中的结构应如下所示:
C:\Users\new-location
中的文件和文件夹应如下所示:
答案 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.r00
,ArchiveName.r01
,...以及更好的命名方案{{1}的多卷存档},ArchiveName.part01.rar
,...默认情况下由 WinRAR 版本5.21使用。 RAR 会在从匹配ArchiveName.part02.rar
的列表中提取多卷存档时自动跳过已处理的存档文件。
评估*.r??
的退出代码以确定是否发生任何错误。如果分配给 errorlevel 的退出代码低于1,则没有错误,并且执行 if 分支的3个命令,导致首先删除所有RAR存档文件。
当前子文件夹中的其余文件也会移动到当前目标文件夹,即文件夹结构示例中的Rar.exe
文件。
由于当前子文件夹现在应为空,命令 rd 应该能够删除该目录。如果由于子文件夹仍然不为空而出现错误,则子文件夹将保留在基本源文件夹中。
如果一切正常但没有错误,则基本源文件夹为空。 for 循环之后的注释行也可用于删除空的基本源文件夹,但如果有任何失败,请保留该文件夹。