标题: [文件操作] 批处理makecab如何压缩多级目录? [打印本页]
作者: crist 时间: 2011-1-10 16:48 标题: 批处理makecab如何压缩多级目录?
在网上下载到老毛桃的makecab批处理如下:复制代码
使用过程中发现将批量文件制作成一个压缩包这个功能不支持多级目录。请问应该怎样使这个批处理支持多级目录呢?
例如我要压缩a文件夹成为a.cab,而a文件夹的结构如下:
a文件夹
|-b文件夹
|-c文件
我自己写了一个代码:- @echo off
- SET C0=MAKECAB /D CompressionType=LZX /D CompressionMemory=21 /D MaxDiskSize=CDROM /D Cabinet=ON /D Compress=ON /D FolderSizeThreshold=5000000
- SET /P Ds=请输入需压缩的文件所在的目录名:
- SET /P FCab=请输入需要保存的压缩包文件名:
- SET C=%C0% /D DiskDirectoryTemplate=.\ /D CabinetNameTemplate=%FCab%
- for /f "delims=" %%a in ('dir /s /b /a-d "%Ds%"') do (
- echo %%a >>tmp.log
- )
- %C% /F tmp.log
- pause
复制代码
错误提示:
tmp.log(括号里是一些数字): ERROR: Duplicate file name: txtsetup.oem already defined at tmp.log(括号里是一些数字)
ERROR: MakeCAB aborted: MaxErrors (20) exceeded
[ 本帖最后由 crist 于 2011-1-10 17:12 编辑 ]
作者: stance 时间: 2011-1-11 21:52 标题: 研究明白再说话
制作CAB压缩包跟压缩单个文件和ISO很不一样,研究明白再说。
[ 本帖最后由 stance 于 2011-1-14 23:00 编辑 ]
作者: cutebe 时间: 2011-1-12 13:45
- :利用MAKECAB压缩目录,且保留目录结构。
- :用法:直接把目录拖到此批处理图标上。
- :特点:甲、一次只支持一个目录,乙、最外层目录会剥离,
- : 丙、目录名直接作为压缩名,丁、不压缩空目录。
- @echo off
- if "%~1"=="" goto :eof
- setlocal enableDelayedExpansion
- cd/d %~dp1
- set List=L.lst
- cd.>%List%
- dir/b/a-d "%~f1">>%List%
- for /f "delims=" %%d in ('dir/s/b/ad "%~f1"')do (
- set D1=%%d
- set D1=!d1:%~f1\=!
- echo=.set DestinationDir=!D1!>>%List%
- for /f "delims=" %%f in ('"dir/b/a-d "%%d" 2>nul"')do echo="%%d\%%f">>%List%
- )
- makecab /f %List% /d CabinetNameTemplate="..\%~n1.CAB"
- rd/s/q disk1
- del/a/f/q setup.inf;setup.rpt;%List%
复制代码
作者: crist 时间: 2011-1-14 20:07 标题: 回复 2楼 的帖子
仅就我截取的那段代码而言,tmp.log只是一个记录文件,它的存放位置应该没影响吧?
作者: crist 时间: 2011-1-14 20:08 标题: 回复 3楼 的帖子
我把你的代码拿来测试了一下,好像不行哦
我把程序同目录的一个文件夹wp拉进程序图标
作者: stance 时间: 2011-1-14 22:41 标题: 回复 4楼 5楼的帖子
说得对。
后来发现,因为先运行了老毛桃的程序,他的运行环境我没删除,以致当时我运行时正常。后来删除%TF% SETUP.INF SETUP.RPT和%TEMP%路径下的相关文件后,就不能正常运行了。
现在我的系统不知出了什么毛病,连老毛桃的程序都不能正常运行了,暂时没法继续试验了。
以前我用MAKECAB只压缩过批量的单个文件,制作ISO,没做过CAB压缩包。现在我正面临这个需求,也很感兴趣。我要的不是手动操作,要加入批处理程序自动运行。等有新进展再交流。
作者: cutebe 时间: 2011-1-14 22:57 标题: 更改一下
- @echo off
- if "%~1"=="" goto :eof
- setlocal enableDelayedExpansion
- cd/d %~dp1
- set List=L.lst
- cd.>%List%
- for /f "delims=" %%f in ('"dir/b/a-d "%~f1" 2>nul"')do echo="%~nx1\%%f">>%List%
- for /f "delims=" %%d in ('dir/s/b/ad "%~f1"')do (
- set D1=%%d
- set D1=!d1:%~f1\=!
- echo=.set DestinationDir=!D1!>>%List%
- for /f "delims=" %%f in ('"dir/b/a-d "%%d" 2>nul"')do echo="%%d\%%f">>%List%
- )
- makecab /f %List% /d CabinetNameTemplate="..\%~n1.CAB"
- rd/s/q disk1
- del/a/f/q setup.inf;setup.rpt;%List%
复制代码
作者: crist 时间: 2011-2-18 22:12 标题: 回复 7楼 的帖子
果然能行,不过能否设置成手动设置待压缩的文件夹?如果待压缩文件夹与程序不在一起,拖放反而是个不方便的设置。
作者: eech 时间: 2019-8-28 13:58
回复 8# crist
注册到右键,保存批处理到system32文件夹
作者: smss 时间: 2022-3-24 00:18
- @Echo off&SetLocal EnableDelayedExpansion
- ::单文件压缩
- makecab /v3 /D CompressionType=LZX /D CompressionMemory=21 "%~1"&set "x=%~1"&set x=!x:~0,-1!&ren "!x!_" "%~n1.cab"
复制代码
- ::多文件压缩
- @Echo off&SetLocal EnableDelayedExpansion
- for /f "delims=" %%f in ('dir /a-d/b "%~f1"')do echo "%~f1\%%f">>list.txt
- for /f "delims=" %%d in ('dir/s/b/ad "%~f1"')do (
- set D1=%%d
- set D1=!d1:%~f1\=!
- echo=.set DestinationDir=!D1!>>list.txt
- for /f "delims=" %%f in ('"dir/b/a-d "%%d" 2>nul"')do echo "%%d\%%f">>list.txt
- )
- makecab /f list.txt /d expresstype=mszip /d expressmemory=21 /d maxdisksize=1024000000 /d diskdirectorytemplate="%~dp1." /d cabinetnametemplate=".\%~n1.cab"
- del/a/f/q setup.inf setup.rpt list.txt
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |