Board logo

标题: [文件操作] [已解决]批处理怎样调用WINRAR压缩文件夹? [打印本页]

作者: 碇シンジ    时间: 2011-10-24 14:20     标题: [已解决]批处理怎样调用WINRAR压缩文件夹?

本帖最后由 碇シンジ 于 2011-11-12 13:00 编辑

假设D:\test 文件夹下面有A,B,C,D,E....N等子文件夹,
现在想制作一个批处理能够拖拽A....N等文件夹进去自动按照文件夹的名字打包. 输出目录是原路径下,
或者是固定路径下D:\test 的所有子文件夹都能够按照文件夹名各自打包好.

例如
d:\test\a\123.txt
d:\test\b\654.txt
               \789.jpg
执行批处理之后是
d:\test\a.rar (包内有123.txt)
d:\test\b.rar(包内有654.txt 以及789.jpg)
这样

倒是翻了一下论坛内的一些帖子.自己水平太低搞不懂.勉强弄出来一份代码但是拖拽去执行的时候却是在打包C:\Documents and Settings\Administrator文件夹下的东西.求指教.
  1. @echo off & setlocal EnableDelayedExpansion
  2. for %%a in (%*) do (
  3. set t=%%a
  4. call "D:\Program Files\WinRAR\winrar.exe" a -epp2 -rr10p "t"
  5. pause
  6. )
复制代码

作者: hfg1977    时间: 2011-10-24 16:01

  1. @goto start
  2. :help
  3. @echo.===== Ver: 1.0 =========================== 发布日期: 2011-05-06 =======
  4. @echo. BAT_NAME: rar最高压缩.bat
  5. @echo. 返回值:
  6. @echo. 作用  : rar最高压缩
  7. @echo. 调用: rar最高压缩.bat [Path...] [file...]
  8. @echo. [Path]: 文件夹路径
  9. @echo. [file]: 文件
  10. @echo. 注: 对于单个文件/夹可以用右键,多个文件/夹请采用拖动方法.
  11. @echo.====================== Copyright@ by hf-g ========= [彭城] ============
  12. ping /n 4 127.0>nul
  13. goto:end
  14. :start ============================================================
  15. @echo off
  16. path=%path%;%~dp0.\..\;%~dp0
  17. ::==================ADD REG===============================
  18. for /f "skip=4 tokens=3" %%a in ('REG QUERY "HKLM\Software\hf'file" /v rarMax 2^>nul') do set KEY_v=%%a
  19. if "%KEY_v%" LSS "1" (
  20. reg add "HKLM\SOFTWARE\Classes\Directory\shell\rar最高压缩\command" /ve /d "\"%~f0\" \"%%1\"" /f>nul
  21. reg add "HKLM\SOFTWARE\Classes\*\shell\rar最高压缩\command" /ve /d "\"%~f0\" \"%%1\"" /f>nul
  22. reg add "HKLM\Software\hf'file" /v rarMax /d 1 /f>nul
  23. )
  24. ::========================================================
  25. if /i "%~1"=="" goto help
  26. if /i "%~1"=="-?" goto help
  27. set "ext="&set "pathname="&set "Dir_name="&set "p_str="
  28. set /a exit_BL=0,D_count=0,f_count=0
  29. call:get_P %*
  30. if "%exit_BL%"=="1" goto end
  31. ::========================MAIN============================
  32. ::建立要压缩文件列表
  33. cd.>"%~dp0.\filelist.txt"
  34. (
  35. if not "%pathname_1%"=="" (for /f "tokens=2 delims==" %%a in ('set pathname_') do echo %%a)
  36. if not "%file_1%"=="" (for /f "tokens=2 delims==" %%a in ('set file_') do  echo %%a)
  37. )>>"%~dp0.\filelist.txt"
  38. ::确定压缩文件名,调用压缩函数
  39. if not "%pathname_1%"=="" (
  40. call:compress "%pathname_1%"
  41. ) else (
  42. if not "%file_1%"=="" (
  43. call:compress "%file_1%"
  44. ))
  45. :end ==============================================================
  46. if exist "%~dp0.\filelist.txt" del/f/q "%~dp0.\filelist.txt"
  47. exit /b
  48. ::=================================================================
  49. :compress <archive_name>
  50. echo rar最高压缩...
  51. ::rar u -m5 -inul -ep1 -ed "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
  52. 7za a -mx=9 -scsWIN "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
  53. ::7za a -sfx7z_美化版.sfx -mx=9 -scsWIN "%~dp1.\%~n1.exe" @"%~dp0.\filelist.txt"
  54. :end
  55. pause
  56. goto:eof
  57. ::========================参数设置与获得============================
  58. :get_p
  59. ::判断%1是文件夹或文件
  60. if "%~1"=="" goto:eof
  61. set "p_str=%~1"
  62. if exist "%p_str%" (
  63. if exist "%p_str%.\" (
  64. set /a D_count+=1&call set "pathname_%%D_count%%=%p_str%"&call set "Dirname_%%D_count%%=%~nx1"&shift /1&goto get_p
  65. )
  66. set /a f_count+=1&call set "file_%%f_count%%=%p_str%"&shift /1&goto get_p
  67. ) else (
  68. echo "%p_str%" 不是一个正确的文件夹路径或文件^!&set /a exit_BL=1&shift /1&goto end
  69. )
  70. @echo off
  71. :get_p_end
  72. goto:eof
  73. ::======================== 未使用 ============================
  74. ::获取winrar安装路径,设置rar绝对路径
  75. For /f "skip=4 tokens=3"  %%i in ('Reg Query "HKCR\Applications\WinRAR.exe\shell\open\command" /ve') do (
  76. echo.%%~i&Set rar_exe=%%~dpi.\rar.exe&call echo.%%rar_exe%%
  77. )
复制代码
稍作修改即可.
作者: 碇シンジ    时间: 2011-10-24 16:33

本帖最后由 碇シンジ 于 2011-10-24 16:53 编辑

回复 2# hfg1977

代码好多.光用看的就觉得功能真强大....
几乎看不懂.自己先折腾看看.不行的话还请再指教
感谢帮助!
作者: 碇シンジ    时间: 2011-10-29 11:37

本帖最后由 碇シンジ 于 2011-10-29 11:54 编辑

回复 2# hfg1977


   抱歉.以自己的能力修改了一下.能正常调用WINRAR进行压缩.单个文件夹或者多个文件夹都没问题.可是执行完的结果有点不一样.本来应该是多个文件夹拖拽进去.每一个文件夹生成一个压缩包.实际上形成的结果是全都压在一个包内了.
以下是修改后的代码
  1.    @goto start
  2.     :help
  3.     @echo.===== Ver: 1.0 =========================== 发布日期: 2011-05-06 =======
  4.     @echo.        BAT_NAME:        rar最高压缩.bat
  5.     @echo.        返回值:               
  6.     @echo.        作用  :                rar最高压缩
  7.     @echo.        调用:        rar最高压缩.bat [Path...] [file...]
  8.     @echo.                [Path]:        文件夹路径
  9.     @echo.                [file]:        文件
  10.     @echo.        注:        对于单个文件/夹可以用右键,多个文件/夹请采用拖动方法.
  11.     @echo.====================== Copyright@ by hf-g ========= [彭城] ============
  12.     ping /n 4 127.0>nul
  13.     goto:end
  14.     :start ============================================================
  15.     @echo off
  16.     path=%path%;%~dp0.\..\;%~dp0
  17.     ::========================================================
  18.     if /i "%~1"=="" goto help
  19.     if /i "%~1"=="-?" goto help
  20.     set "ext="&set "pathname="&set "Dir_name="&set "p_str="
  21.     set /a exit_BL=0,D_count=0,f_count=0
  22.     call:get_P %*
  23.     if "%exit_BL%"=="1" goto end
  24.     ::========================MAIN============================
  25.     ::建立要压缩文件列表
  26.     cd.>"%~dp0.\filelist.txt"
  27.     (
  28.     if not "%pathname_1%"=="" (for /f "tokens=2 delims==" %%a in ('set pathname_') do echo %%a)
  29.     if not "%file_1%"=="" (for /f "tokens=2 delims==" %%a in ('set file_') do  echo %%a)
  30.     )>>"%~dp0.\filelist.txt"
  31.     ::确定压缩文件名,调用压缩函数
  32.     if not "%pathname_1%"=="" (
  33.     call:compress "%pathname_1%"
  34.     ) else (
  35.     if not "%file_1%"=="" (
  36.     call:compress "%file_1%"
  37.     ))
  38.     :end ==============================================================
  39.     if exist "%~dp0.\filelist.txt" del/f/q "%~dp0.\filelist.txt"
  40.     exit /b
  41.     ::===========================调用并进行压缩==================================
  42.     :compress <archive_name>
  43.     echo rar最高压缩...
  44.     "D:\Program Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
  45.     :end
  46.     pause
  47.     goto:eof
  48.     ::========================参数设置与获得============================
  49.     :get_p
  50.     ::判断%1是文件夹或文件
  51.     if "%~1"=="" goto:eof
  52.     set "p_str=%~1"
  53.     if exist "%p_str%" (
  54.             if exist "%p_str%.\" (
  55.             set /a D_count+=1&call set "pathname_%%D_count%%=%p_str%"&call set "Dirname_%%D_count%%=%~nx1"&shift /1&goto get_p
  56.             )
  57.             set /a f_count+=1&call set "file_%%f_count%%=%p_str%"&shift /1&goto get_p
  58.     ) else (
  59.             echo "%p_str%" 不是一个正确的文件夹路径或文件^!&set /a exit_BL=1&shift /1&goto end
  60.     )
  61.     @echo off
  62.     :get_p_end
  63.     goto:eof
复制代码
以下是自己参照上面那句调用WINRAR的语句折腾出来的.可惜还是做不到那种效果,第一个只能单文件夹拖拽打包.第二个的效果就跟上面的代码一样.会把拖拽进去的所有文件夹打包在一起.
  1. for /d %%i in (%*) do (
  2. "D:\Program Files\WinRAR\winrar.exe" u -m5  -ep1 -ed "%*.rar" "%*"
  3.                       )
  4. pause
  5. exit
复制代码
  1. for %%f in (%*) do (
  2. "D:\Program Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%~dp1%~n1.rar" %*
  3. )
  4. pause
  5. exit
复制代码
继续求帮忙....
同时有一个想法是根据2L的hfg1977给出的代码.会调用到一个FILELIST.TXT文件.能不能把"调用并进行压缩"里面的代码给修改成按FILELIST.TXT每一行内容压缩一次呢?但是自己不会弄.
作者: yangfengoo    时间: 2011-10-29 12:10

自己为什么不去看看批处理的基本语句命令呢?
作者: 碇シンジ    时间: 2011-10-29 13:27

本帖最后由 碇シンジ 于 2011-10-29 13:34 编辑

回复 5# yangfengoo


    请问具体是指那些语句或者哪些帖子可以参考吗?
站内搜索了一下没有基本语句或者类似标题的帖子....
作者: lvsehuaxue    时间: 2011-10-29 20:39

  1. @"C:\Program Files\WinRAR\WinRAR.exe" A d:\test\%~n1 %1
复制代码

作者: hfg1977    时间: 2011-10-29 21:56

能不能把"调用并进行压缩"里面的代码给修改成按FILELIST.TXT每一行内容压缩一次呢?但是自己不会弄.


[font color=red] 是的, 只需更改 ":compress <archive_name> " 子过程即可实现你的功能,代码如下:
  1. :compress <archive_name>
  2. echo rar最高压缩...
  3. ::rar u -m5 -inul -ep1 -ed "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
  4. ::7za a -mx=9 -scsWIN "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
  5. ::7za a -sfx7z_美化版.sfx -mx=9 -scsWIN "%~dp1.\%~n1.exe" @"%~dp0.\filelist.txt"
  6. echo rar最高压缩... [分别压缩成数个]
  7. for /f "tokens=* usebackq" %%a in ("%~dp0.\filelist.txt") do (
  8. 7za a -mx=9 -scsWIN "%~dp1.\%%~nxa.rar" "%%~a"
  9. )
  10. pause
  11. goto:eof
复制代码

作者: hfg1977    时间: 2011-10-29 22:24

楼主一眼就看到问题的关键呀, 我都没想到怎么改才更简单.

另 winrar.exe 与 rar.exe 是不同的,区别请看其help文件.
作者: 碇シンジ    时间: 2011-11-12 12:59

本帖最后由 碇シンジ 于 2011-11-12 13:04 编辑
楼主一眼就看到问题的关键呀, 我都没想到怎么改才更简单.

另 winrar.exe 与 rar.exe 是不同的,区别请看其 ...
hfg1977 发表于 2011-10-29 22:24

抱歉.最近都没回来看.没注意到大大已经给出了答案.实在抱歉....辛苦大大了.感谢大大帮忙.同样也感谢另外几位大大的帮忙
"另 winrar.exe 与 rar.exe 是不同的" 这个倒是没注意.因为直接用的绿化版.所以注册表都没注册直接绝对路径引用WINRAR.EXE了.另外自己也尝试了一下直接修改也达到了对应的目的.自己这边是直接跳过了FILELIST.TXT的功能.将写入到FILELIST的功能直接变成了压缩.
还是不如大大做的修改更好....
  1.     @goto start
  2.     :help
  3.     @echo.===== Ver: 1.0 =========================== 发布日期: 2011-05-06 =======
  4.     @echo.        BAT_NAME:        rar最高压缩.bat
  5.     @echo.        返回值:               
  6.     @echo.        作用  :                rar最高压缩
  7.     @echo.        调用:        rar最高压缩.bat [Path...] [file...]
  8.     @echo.                [Path]:        文件夹路径
  9.     @echo.                [file]:        文件
  10.     @echo.        注:        对于单个文件/夹可以用右键,多个文件/夹请采用拖动方法.
  11.     @echo.====================== Copyright@ by hf-g ========= [彭城] ============
  12.     ping /n 4 127.0>nul
  13.     goto:end
  14.     :start ============================================================
  15.     @echo off
  16.     path=%path%;%~dp0.\..\;%~dp0
  17.     ::========================================================
  18.     if /i "%~1"=="" goto help
  19.     if /i "%~1"=="-?" goto help
  20.     set "ext="&set "pathname="&set "Dir_name="&set "p_str="
  21.     set /a exit_BL=0,D_count=0,f_count=0
  22.     call:get_P %*
  23.     if "%exit_BL%"=="1" goto end
  24.     ::========================MAIN============================
  25. ::
  26. ::
  27. ::  如果WINRAR的所在文件夹不是D:\program files的话.修改DO后面的WINRAR.EXE路径!
  28. ::
  29. ::
  30.     ::建立要压缩文件列表
  31.     cd.>"%~dp0.\filelist.txt"
  32.     (
  33.     if not "%pathname_1%"=="" (for /f "tokens=2 delims==" %%a in ('set pathname_') do "D:\Program
  34. Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%%a.rar" "%%a")
  35.     if not "%file_1%"=="" (for /f "tokens=2 delims==" %%a in ('set file_') do  "D:\Program
  36. Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%%a.rar" "%%a")
  37.     )>>"%~dp0.\filelist.txt"
  38.     ::确定压缩文件名,调用压缩函数
  39.     if not "%pathname_1%"=="" (
  40.     call:compress "%pathname_1%"
  41.     ) else (
  42.     if not "%file_1%"=="" (
  43.     call:compress "%file_1%"
  44.     ))
  45.     :end ==============================================================
  46.     if exist "%~dp0.\filelist.txt" del/f/q "%~dp0.\filelist.txt"
  47.     exit /b
  48.     ::=================================================================
  49.     :compress <archive_name>
  50.     echo rar最高压缩...
  51.     echo ok
  52.     :end
  53.     pause
  54.     goto:eof
  55.     ::========================参数设置与获得============================
  56.     :get_p
  57.     ::判断%1是文件夹或文件
  58.     if "%~1"=="" goto:eof
  59.     set "p_str=%~1"
  60.     if exist "%p_str%" (
  61.             if exist "%p_str%.\" (
  62.             set /a D_count+=1&call set "pathname_%%D_count%%=%p_str%"&call set "Dirname_%%D_count%%
  63. =%~nx1"&shift /1&goto get_p
  64.             )
  65.             set /a f_count+=1&call set "file_%%f_count%%=%p_str%"&shift /1&goto get_p
  66.     ) else (
  67.             echo "%p_str%" 不是一个正确的文件夹路径或文件^!&set /a exit_BL=1&shift /1&goto end
  68.     )
  69.     @echo off
  70.     :get_p_end
  71.     goto:eof
复制代码





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