找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 19927|回复: 2

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

[复制链接]
发表于 2012-2-1 15:59:51 | 显示全部楼层 |阅读模式
因为有些论坛的附件有体积限制,所以大文件往往用压缩分卷的形式上传,可是下载的时候,却常常碰到压缩分卷被论坛分配为数字名或随机文件名的现象,本脚本就是为了在一定程度上解决压缩分卷重新排序的难题而写的,能够自动将压缩分卷按卷号重新命名,但暂不支持同时对来自不同压缩包的分卷进行区分,也就是说,只能够处理来自同一个压缩包序列的压缩分卷。

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

为了提高可读性,以便有兴趣、有时间的人修改完善,故而代码显得比较冗长,见谅。
  1. @echo off&setlocal enabledelayedexpansion
  2. echo;
  3. for /f "tokens=1* delims==" %%a in ('"ftype winrar||echo error"') do (
  4.         if %%a==error (
  5.                 echo;
  6.                 echo 因 rar 格式未与 Winrar 关联,故无法获取 WinRar 安装位置。
  7.                 echo;&pause&exit
  8.         ) else path %%~dpb;%path%
  9. )
  10. set d=
  11. for /l %%a in (1 2 28) do set d=!d!==
  12. cd /d "%~dp1"
  13. echo !d:~3!将被整理的文件!d:~3!
  14. if "%~1" neq "" (for %%a in (%*) do if /i %%~xa==.rar echo %%a) else dir /b *.rar
  15. echo !d!========!d!
  16. rem 列举文件列表
  17. echo;
  18. echo     本脚本用于批量整理压缩分卷,自动将压缩分卷按卷号重新命名,暂不支持同时对来自不同压缩包的分卷进行区分。
  19. echo;
  20. echo     现在请为改名后的 rar 指定一个文件名,如拖入一个文件到窗口则取其文件名。直接回车则以找到的第一个压缩分卷为名。
  21. :again
  22. echo;
  23. set name=
  24. set /p name=输入:
  25. for /f "delims=" %%a in ("!name!") do set name=%%~nxa
  26. for /f tokens^=2delims^=\/:*?^"^<^>^| %%a in ("[!name!]") do (
  27.         echo 输入有误,文件名不能含有 \ / : * ? " < > | 等字符。
  28.         goto again
  29. )
  30. rem 设置整理后的文件名
  31. set error=
  32. if "%~1" neq "" (
  33.         ren *.$rar$ *.rar 2>nul
  34.         for %%a in (%*) do if /i %%~xa==.rar ren "%%~a" *.$rar$
  35. ) else ren *.rar *.$rar$
  36. rem 修改需要处理的文件的后缀名,以便与无须处理的 rar 区别开来
  37. for /f "tokens=1*" %%a in ('rar v *.$rar$^|findstr /rc:"^卷" /c:"卷 [0-9]*$"') do (
  38.         set /a n=^^!n
  39.         if !n!==1 (
  40.                 set "file=%%~nb"
  41.                 rem 获取 rar 文件名
  42.         ) else (
  43.                 for /f "tokens=5" %%c in ("%%b") do (
  44.                         set /a num=%%c+1000
  45.                         if not defined name if !num!==1001 set name=!file!
  46.                 )
  47.                 rem 获取所属卷数
  48.                 for %%c in (!num:~-3!) do (
  49.                         if defined part%%c set error=1
  50.                         set part%%c="!file!.rar" !part%%c!
  51.                 )
  52.                 rem 保存文件列表
  53.         )
  54. )
  55. echo;
  56. echo !d!文件列表!d!
  57. set part
  58. echo !d!========!d!
  59. echo;
  60. rem 显示文件列表
  61. ren *.$rar$ *.rar
  62. if defined error (
  63.         echo Error:以下文件的卷号重复:
  64.         for /f "tokens=1* delims==" %%a in ('set part^|findstr /c:"" ""') do (
  65.                 echo;
  66.                 echo [%%a]
  67.                 for %%c in (%%b) do (
  68.                         echo 文件大小:%%~zc B  修改日期:%%~tc  文件名:%%~nxc
  69.                 )
  70.         )
  71.         rem 检查是否有重复卷
  72. ) else (
  73.         for /l %%a in (1001 1 !num!) do (
  74.                 set num=%%a
  75.                 if not defined part!num:~-3! (
  76.                         echo Error:缺少第 !num:~-3! 卷
  77.                         set error=1
  78.                 )
  79.         )
  80.         rem 检查是否有缺少卷
  81.         if not defined error (
  82.                 for /f "tokens=1,2* delims==*" %%a in ('set part') do (
  83.                         set num=%%a
  84.                         ren %%b "!name!.part!num:~-3!.$rar$"||set error=1
  85.                 )
  86.         )
  87.         rem 按第一个分卷名改名
  88.         if not defined error (
  89.                 rar t "!name!.part???.$rar$"&&echo 测试成功
  90.         )||(
  91.                 for /f "tokens=1,2* delims==*" %%a in ('set part') do (
  92.                         ren "!name!.%%a.$rar$" %%b
  93.                 )
  94.         ) 2>nul
  95.         rem 对改名后的 rar 进行测试,失败时还原名称
  96. )
  97. echo;
  98. ren *.$rar$ *.rar 2>nul
  99. pause
复制代码

评分

参与人数 2PB +5 技术 +2 收起 理由
331252240 + 1 感谢分享
zqz0012005 + 5 + 1 感谢分享

查看全部评分

发表于 2012-2-1 20:08:50 | 显示全部楼层
很好,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:16 , Processed in 0.019150 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表