Board logo

标题: [文件管理] 批处理还原 rar 压缩分卷顺序 [打印本页]

作者: CrLf    时间: 2012-2-1 15:59     标题: 批处理还原 rar 压缩分卷顺序

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

如果要处理指定的压缩包,请 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
复制代码

作者: fs2018    时间: 2012-2-1 20:08

很好,学习了




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2