返回列表 发帖

[文件管理] 批处理还原 rar 压缩分卷顺序

因为有些论坛的附件有体积限制,所以大文件往往用压缩分卷的形式上传,可是下载的时候,却常常碰到压缩分卷被论坛分配为数字名或随机文件名的现象,本脚本就是为了在一定程度上解决压缩分卷重新排序的难题而写的,能够自动将压缩分卷按卷号重新命名,但暂不支持同时对来自不同压缩包的分卷进行区分,也就是说,只能够处理来自同一个压缩包序列的压缩分卷。

如果要处理指定的压缩包,请 ctrl 选中它们,拖入到批处理的图标上运行,否则将对当前文件夹下所有的 rar 进行处理。
需要用到 rar.exe,所以请确保电脑中装有 winrar,否则很可能无法获取其所在路径。
因为需要将要处理的文件改名,以便和其他 rar 进行区分,所以如果在要处理的文件的所在目录中存在 *.$rar$ 可能导致整理失败。
若存在相同卷号或卷号的序列不完整,再或者在最终的测试中失败,则将所处理的 rar 改回原名并等待任意键退出。

为了提高可读性,以便有兴趣、有时间的人修改完善,故而代码显得比较冗长,见谅。
@echo off&setlocal enabledelayedexpansion
echo;
for /f "tokens=1* delims==" %%a in ('"ftype winrar||echo error"') do (
if %%a==error (
echo;
echo 因 rar 格式未与 Winrar 关联,故无法获取 WinRar 安装位置。
echo;&pause&exit
) else path %%~dpb;%path%
)
set d=
for /l %%a in (1 2 28) do set d=!d!==
cd /d "%~dp1"
echo !d:~3!将被整理的文件!d:~3!
if "%~1" neq "" (for %%a in (%*) do if /i %%~xa==.rar echo %%a) else dir /b *.rar
echo !d!========!d!
rem 列举文件列表
echo;
echo     本脚本用于批量整理压缩分卷,自动将压缩分卷按卷号重新命名,暂不支持同时对来自不同压缩包的分卷进行区分。
echo;
echo     现在请为改名后的 rar 指定一个文件名,如拖入一个文件到窗口则取其文件名。直接回车则以找到的第一个压缩分卷为名。
:again
echo;
set name=
set /p name=输入:
for /f "delims=" %%a in ("!name!") do set name=%%~nxa
for /f tokens^=2delims^=\/:*?^"^<^>^| %%a in ("[!name!]") do (
echo 输入有误,文件名不能含有 \ / : * ? " < > | 等字符。
goto again
)
rem 设置整理后的文件名
set error=
if "%~1" neq "" (
ren *.$rar$ *.rar 2>nul
for %%a in (%*) do if /i %%~xa==.rar ren "%%~a" *.$rar$
) else ren *.rar *.$rar$
rem 修改需要处理的文件的后缀名,以便与无须处理的 rar 区别开来
for /f "tokens=1*" %%a in ('rar v *.$rar$^|findstr /rc:"^卷" /c:"卷 [0-9]*$"') do (
set /a n=^^!n
if !n!==1 (
set "file=%%~nb"
rem 获取 rar 文件名
) else (
for /f "tokens=5" %%c in ("%%b") do (
set /a num=%%c+1000
if not defined name if !num!==1001 set name=!file!
)
rem 获取所属卷数
for %%c in (!num:~-3!) do (
if defined part%%c set error=1
set part%%c="!file!.rar" !part%%c!
)
rem 保存文件列表
)
)
echo;
echo !d!文件列表!d!
set part
echo !d!========!d!
echo;
rem 显示文件列表
ren *.$rar$ *.rar
if defined error (
echo Error:以下文件的卷号重复:
for /f "tokens=1* delims==" %%a in ('set part^|findstr /c:"\" \""') do (
echo;
echo [%%a]
for %%c in (%%b) do (
echo 文件大小:%%~zc B  修改日期:%%~tc  文件名:%%~nxc
)
)
rem 检查是否有重复卷
) else (
for /l %%a in (1001 1 !num!) do (
set num=%%a
if not defined part!num:~-3! (
echo Error:缺少第 !num:~-3!
set error=1
)
)
rem 检查是否有缺少卷
if not defined error (
for /f "tokens=1,2* delims==*" %%a in ('set part') do (
set num=%%a
ren %%b "!name!.part!num:~-3!.$rar$"||set error=1
)
)
rem 按第一个分卷名改名
if not defined error (
rar t "!name!.part???.$rar$"&&echo 测试成功
)||(
for /f "tokens=1,2* delims==*" %%a in ('set part') do (
ren "!name!.%%a.$rar$" %%b
)
) 2>nul
rem 对改名后的 rar 进行测试,失败时还原名称
)
echo;
ren *.$rar$ *.rar 2>nul
pauseCOPY
2

评分人数

很好,学习了

TOP

返回列表