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