标题: [文件操作] [已解决]批处理怎样调用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文件夹下的东西.求指教.- @echo off & setlocal EnableDelayedExpansion
- for %%a in (%*) do (
- set t=%%a
- call "D:\Program Files\WinRAR\winrar.exe" a -epp2 -rr10p "t"
- pause
- )
复制代码
作者: hfg1977 时间: 2011-10-24 16:01
- @goto start
- :help
- @echo.===== Ver: 1.0 =========================== 发布日期: 2011-05-06 =======
- @echo. BAT_NAME: rar最高压缩.bat
- @echo. 返回值:
- @echo. 作用 : rar最高压缩
- @echo. 调用: rar最高压缩.bat [Path...] [file...]
- @echo. [Path]: 文件夹路径
- @echo. [file]: 文件
- @echo. 注: 对于单个文件/夹可以用右键,多个文件/夹请采用拖动方法.
- @echo.====================== Copyright@ by hf-g ========= [彭城] ============
- ping /n 4 127.0>nul
- goto:end
- :start ============================================================
- @echo off
- path=%path%;%~dp0.\..\;%~dp0
- ::==================ADD REG===============================
- for /f "skip=4 tokens=3" %%a in ('REG QUERY "HKLM\Software\hf'file" /v rarMax 2^>nul') do set KEY_v=%%a
- if "%KEY_v%" LSS "1" (
- reg add "HKLM\SOFTWARE\Classes\Directory\shell\rar最高压缩\command" /ve /d "\"%~f0\" \"%%1\"" /f>nul
- reg add "HKLM\SOFTWARE\Classes\*\shell\rar最高压缩\command" /ve /d "\"%~f0\" \"%%1\"" /f>nul
- reg add "HKLM\Software\hf'file" /v rarMax /d 1 /f>nul
- )
- ::========================================================
- if /i "%~1"=="" goto help
- if /i "%~1"=="-?" goto help
- set "ext="&set "pathname="&set "Dir_name="&set "p_str="
- set /a exit_BL=0,D_count=0,f_count=0
-
- call:get_P %*
- if "%exit_BL%"=="1" goto end
- ::========================MAIN============================
- ::建立要压缩文件列表
- cd.>"%~dp0.\filelist.txt"
- (
- if not "%pathname_1%"=="" (for /f "tokens=2 delims==" %%a in ('set pathname_') do echo %%a)
- if not "%file_1%"=="" (for /f "tokens=2 delims==" %%a in ('set file_') do echo %%a)
- )>>"%~dp0.\filelist.txt"
-
- ::确定压缩文件名,调用压缩函数
- if not "%pathname_1%"=="" (
- call:compress "%pathname_1%"
- ) else (
- if not "%file_1%"=="" (
- call:compress "%file_1%"
- ))
-
- :end ==============================================================
- if exist "%~dp0.\filelist.txt" del/f/q "%~dp0.\filelist.txt"
- exit /b
- ::=================================================================
- :compress <archive_name>
- echo rar最高压缩...
- ::rar u -m5 -inul -ep1 -ed "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
- 7za a -mx=9 -scsWIN "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
- ::7za a -sfx7z_美化版.sfx -mx=9 -scsWIN "%~dp1.\%~n1.exe" @"%~dp0.\filelist.txt"
- :end
- pause
- goto:eof
- ::========================参数设置与获得============================
- :get_p
- ::判断%1是文件夹或文件
- if "%~1"=="" goto:eof
- set "p_str=%~1"
- if exist "%p_str%" (
- if exist "%p_str%.\" (
- set /a D_count+=1&call set "pathname_%%D_count%%=%p_str%"&call set "Dirname_%%D_count%%=%~nx1"&shift /1&goto get_p
- )
- set /a f_count+=1&call set "file_%%f_count%%=%p_str%"&shift /1&goto get_p
- ) else (
- echo "%p_str%" 不是一个正确的文件夹路径或文件^!&set /a exit_BL=1&shift /1&goto end
- )
- @echo off
- :get_p_end
- goto:eof
-
- ::======================== 未使用 ============================
- ::获取winrar安装路径,设置rar绝对路径
- For /f "skip=4 tokens=3" %%i in ('Reg Query "HKCR\Applications\WinRAR.exe\shell\open\command" /ve') do (
- echo.%%~i&Set rar_exe=%%~dpi.\rar.exe&call echo.%%rar_exe%%
- )
复制代码
稍作修改即可.
作者: 碇シンジ 时间: 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进行压缩.单个文件夹或者多个文件夹都没问题.可是执行完的结果有点不一样.本来应该是多个文件夹拖拽进去.每一个文件夹生成一个压缩包.实际上形成的结果是全都压在一个包内了.
以下是修改后的代码-
- @goto start
- :help
- @echo.===== Ver: 1.0 =========================== 发布日期: 2011-05-06 =======
- @echo. BAT_NAME: rar最高压缩.bat
- @echo. 返回值:
- @echo. 作用 : rar最高压缩
- @echo. 调用: rar最高压缩.bat [Path...] [file...]
- @echo. [Path]: 文件夹路径
- @echo. [file]: 文件
- @echo. 注: 对于单个文件/夹可以用右键,多个文件/夹请采用拖动方法.
- @echo.====================== Copyright@ by hf-g ========= [彭城] ============
- ping /n 4 127.0>nul
- goto:end
- :start ============================================================
- @echo off
- path=%path%;%~dp0.\..\;%~dp0
- ::========================================================
- if /i "%~1"=="" goto help
- if /i "%~1"=="-?" goto help
- set "ext="&set "pathname="&set "Dir_name="&set "p_str="
- set /a exit_BL=0,D_count=0,f_count=0
-
- call:get_P %*
- if "%exit_BL%"=="1" goto end
- ::========================MAIN============================
- ::建立要压缩文件列表
- cd.>"%~dp0.\filelist.txt"
- (
- if not "%pathname_1%"=="" (for /f "tokens=2 delims==" %%a in ('set pathname_') do echo %%a)
- if not "%file_1%"=="" (for /f "tokens=2 delims==" %%a in ('set file_') do echo %%a)
- )>>"%~dp0.\filelist.txt"
-
- ::确定压缩文件名,调用压缩函数
- if not "%pathname_1%"=="" (
- call:compress "%pathname_1%"
- ) else (
- if not "%file_1%"=="" (
- call:compress "%file_1%"
- ))
-
- :end ==============================================================
- if exist "%~dp0.\filelist.txt" del/f/q "%~dp0.\filelist.txt"
- exit /b
- ::===========================调用并进行压缩==================================
- :compress <archive_name>
- echo rar最高压缩...
- "D:\Program Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
- :end
- pause
- goto:eof
- ::========================参数设置与获得============================
- :get_p
- ::判断%1是文件夹或文件
- if "%~1"=="" goto:eof
- set "p_str=%~1"
- if exist "%p_str%" (
- if exist "%p_str%.\" (
- set /a D_count+=1&call set "pathname_%%D_count%%=%p_str%"&call set "Dirname_%%D_count%%=%~nx1"&shift /1&goto get_p
- )
- set /a f_count+=1&call set "file_%%f_count%%=%p_str%"&shift /1&goto get_p
- ) else (
- echo "%p_str%" 不是一个正确的文件夹路径或文件^!&set /a exit_BL=1&shift /1&goto end
- )
- @echo off
- :get_p_end
- goto:eof
复制代码
以下是自己参照上面那句调用WINRAR的语句折腾出来的.可惜还是做不到那种效果,第一个只能单文件夹拖拽打包.第二个的效果就跟上面的代码一样.会把拖拽进去的所有文件夹打包在一起.- for /d %%i in (%*) do (
- "D:\Program Files\WinRAR\winrar.exe" u -m5 -ep1 -ed "%*.rar" "%*"
- )
- pause
- exit
复制代码
- for %%f in (%*) do (
- "D:\Program Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%~dp1%~n1.rar" %*
- )
- pause
- 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
- @"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> " 子过程即可实现你的功能,代码如下:- :compress <archive_name>
- echo rar最高压缩...
- ::rar u -m5 -inul -ep1 -ed "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
- ::7za a -mx=9 -scsWIN "%~dp1.\%~n1.rar" @"%~dp0.\filelist.txt"
- ::7za a -sfx7z_美化版.sfx -mx=9 -scsWIN "%~dp1.\%~n1.exe" @"%~dp0.\filelist.txt"
-
- echo rar最高压缩... [分别压缩成数个]
- for /f "tokens=* usebackq" %%a in ("%~dp0.\filelist.txt") do (
- 7za a -mx=9 -scsWIN "%~dp1.\%%~nxa.rar" "%%~a"
- )
- pause
- 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的功能直接变成了压缩.
还是不如大大做的修改更好....- @goto start
- :help
- @echo.===== Ver: 1.0 =========================== 发布日期: 2011-05-06 =======
- @echo. BAT_NAME: rar最高压缩.bat
- @echo. 返回值:
- @echo. 作用 : rar最高压缩
- @echo. 调用: rar最高压缩.bat [Path...] [file...]
- @echo. [Path]: 文件夹路径
- @echo. [file]: 文件
- @echo. 注: 对于单个文件/夹可以用右键,多个文件/夹请采用拖动方法.
- @echo.====================== Copyright@ by hf-g ========= [彭城] ============
- ping /n 4 127.0>nul
- goto:end
- :start ============================================================
- @echo off
- path=%path%;%~dp0.\..\;%~dp0
- ::========================================================
- if /i "%~1"=="" goto help
- if /i "%~1"=="-?" goto help
- set "ext="&set "pathname="&set "Dir_name="&set "p_str="
- set /a exit_BL=0,D_count=0,f_count=0
- call:get_P %*
- if "%exit_BL%"=="1" goto end
- ::========================MAIN============================
- ::
- ::
- :: 如果WINRAR的所在文件夹不是D:\program files的话.修改DO后面的WINRAR.EXE路径!
- ::
- ::
- ::建立要压缩文件列表
- cd.>"%~dp0.\filelist.txt"
- (
- if not "%pathname_1%"=="" (for /f "tokens=2 delims==" %%a in ('set pathname_') do "D:\Program
- Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%%a.rar" "%%a")
- if not "%file_1%"=="" (for /f "tokens=2 delims==" %%a in ('set file_') do "D:\Program
- Files\WinRAR\winrar.exe" u -m5 -inul -ep1 -ed "%%a.rar" "%%a")
- )>>"%~dp0.\filelist.txt"
- ::确定压缩文件名,调用压缩函数
- if not "%pathname_1%"=="" (
- call:compress "%pathname_1%"
- ) else (
- if not "%file_1%"=="" (
- call:compress "%file_1%"
- ))
- :end ==============================================================
- if exist "%~dp0.\filelist.txt" del/f/q "%~dp0.\filelist.txt"
- exit /b
- ::=================================================================
- :compress <archive_name>
- echo rar最高压缩...
- echo ok
- :end
- pause
- goto:eof
- ::========================参数设置与获得============================
- :get_p
- ::判断%1是文件夹或文件
- if "%~1"=="" goto:eof
- set "p_str=%~1"
- if exist "%p_str%" (
- if exist "%p_str%.\" (
- set /a D_count+=1&call set "pathname_%%D_count%%=%p_str%"&call set "Dirname_%%D_count%%
- =%~nx1"&shift /1&goto get_p
- )
- set /a f_count+=1&call set "file_%%f_count%%=%p_str%"&shift /1&goto get_p
- ) else (
- echo "%p_str%" 不是一个正确的文件夹路径或文件^!&set /a exit_BL=1&shift /1&goto end
- )
- @echo off
- :get_p_end
- goto:eof
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |