Board logo

标题: [文件操作] 批处理makecab如何压缩多级目录? [打印本页]

作者: crist    时间: 2011-1-10 16:48     标题: 批处理makecab如何压缩多级目录?

在网上下载到老毛桃的makecab批处理如下:
  1. @ECHO OFF
  2. SET TT=老毛桃制作的批量文件 CAB 打包工具
  3. COLOR 1F
  4. TITLE %TT%
  5. SET ERR=
  6. SET C0=MAKECAB /D CompressionType=LZX /D CompressionMemory=21 /D MaxDiskSize=CDROM /D Cabinet=ON /D Compress=ON /D FolderSizeThreshold=5000000
  7. :BEGIN
  8. CLS
  9. ECHO.
  10. ECHO        ╭══════════════════╮
  11. ECHO        ║                  ║
  12. ECHO    ╭═══┤ 老毛桃制作的批量文件 CAB 打包工具! ├═══╮
  13. ECHO    ║   ║                  ║   ║
  14. ECHO    ║   ╰══════════════════╯   ║
  15. ECHO    ║                          ║
  16. ECHO    ║   您是需要将批量文件制作成一个压缩包呢?     ║
  17. ECHO    ║   还是想生成 N 个 CAB 格式的单独压缩文件?    ║
  18. ECHO    ║                          ║
  19. ECHO    ║    [1] 将批量文件制作成一个压缩包        ║
  20. ECHO    ║    [2] 将每个文件制作成单独压缩文件       ║
  21. ECHO    ║    [3] 将单个文件制作成单独压缩文件       ║
  22. ECHO    ║    [Q] 退出                   ║
  23. ECHO    ║                          ║
  24. ECHO    ╟──────────────────────────╢
  25. ECHO    ║ 注:1. 待压缩文件的父目录需与本程序在同一路径下; ║
  26. ECHO    ║   2. 待压缩文件所在路径(包括父路径)不许有空格。 ║
  27. ECHO    ╟══════════════════════════╢
  28. ECHO    ║ 版权所有:老毛桃   供无忧朋友们交流,翻版不究 ║
  29. ECHO    ╰──────────────────────────╯
  30. ECHO.
  31. SET Choice=
  32. SET /P Choice=    请选择要进行的操作(1/2/3/Q),然后按回车:
  33. IF NOT '%Choice%'=='' SET Choice=%Choice:~0,1%
  34. IF /I '%Choice%'=='1' GOTO LOOPA
  35. IF /I '%Choice%'=='2' GOTO LOOPA
  36. IF /I '%Choice%'=='3' GOTO LOOPD
  37. IF /I '%Choice%'=='Q' EXIT
  38. GOTO BEGIN
  39. :LOOPA
  40. IF /I '%Choice%'=='1' (
  41. TITLE %TT% - 制作成一个压缩包
  42. )
  43. IF /I '%Choice%'=='2' (
  44. TITLE %TT% - 制作成多个单独压缩文件
  45. )
  46. IF "%Err%"=="" (
  47. CLS
  48. )
  49. ECHO 请输入需压缩的文件所在的目录名,如 Files
  50. SET Ds=
  51. SET /P Ds=
  52. IF "%Ds%"=="" goto LOOPA
  53. IF NOT EXIST %Ds% (
  54. SET Err=1
  55. ECHO.
  56. CLS
  57. ECHO 您所输入的路径不存在,请重新输入
  58. ECHO.
  59. GOTO LOOPA
  60. )
  61. IF /I '%Choice%'=='1' GOTO LOOPB
  62. GOTO LOOPC
  63. :LOOPB
  64. CLS
  65. ECHO 请输入需要保存的压缩包文件名,如 Drive.CAB
  66. SET FCab=
  67. SET /P FCab=
  68. IF "%FCab%"=="" goto LOOPB
  69. SET C=%C0% /D DiskDirectoryTemplate=.\ /D CabinetNameTemplate=%FCab%
  70. SET TF=%TEMP%\Files.tmp
  71. IF EXIST %TF% DEL %TF% >NUL
  72. FOR /F %%i in ('dir /b %Ds%') do ECHO %Ds%\%%i >>%TF%
  73. ECHO.
  74. %C% /F %TF%
  75. DEL /F /S /Q %TF% SETUP.INF SETUP.RPT >NUL
  76. GOTO EXIT
  77. :LOOPC
  78. CLS
  79. ECHO 请输入需要保存的 CAB 格式文件所在路径,比如 OutFile
  80. ECHO 如果此路径不存在,将在当前目录下自动创建。
  81. SET OUT=
  82. SET /P OUT=
  83. IF "%OUT%"=="" GOTO LOOPC
  84. FOR /F %%I IN ('CD') DO SET P=%%I\%Ds%
  85. SET C=%C0% /L %OUT% %P%\
  86. ECHO.
  87. FOR /F %%I IN ('dir /B %Ds%') do %C%%%I
  88. GOTO EXIT
  89. :LOOPD
  90. TITLE %TT% - 只压缩一个文件
  91. IF "%Err%"=="" (
  92. CLS
  93. )
  94. ECHO 请输入需要需要压缩的文件所在路径,比如 Driver\NV4_Disp.SYS
  95. ECHO 其中 Driver 与本程序在同一文件夹中
  96. ECHO 您也可以选择按 TAB 键快速输入路径和文件名称,完成后按回车确认
  97. SET FileR=
  98. SET /P FileR=
  99. IF "%FileR%"=="" (
  100. CLS
  101. GOTO LOOPD
  102. )
  103. IF NOT EXIST "%FileR%" (
  104. SET Err=1
  105. ECHO.
  106. CLS
  107. ECHO 您所输入的文件路径不存在,请重新输入
  108. ECHO.
  109. GOTO LOOPD
  110. )
  111. GOTO LOOPE
  112. :LOOPE
  113. CLS
  114. ECHO 请输入需要需要保存的压缩文件路径,比如 Driver\NV4_Disp.CAB
  115. ECHO 如果不输入文件路径,则以 NV4_Disp.SY_ 的形式保存在本程序所在路径
  116. ECHO.
  117. ECHO 注意:如果尝试输入一个不存在的路径信息,压缩程序会出错!
  118. SET FileT=
  119. SET /P FileT=
  120. %C0% %FileR% %FileT%
  121. GOTO EXIT
  122. :EXIT
  123. ECHO.
  124. ECHO.
  125. ECHO.
  126. ECHO 您需要的操作已经全部完成,请核查. . .
  127. ECHO.
  128. ECHO 老毛桃感谢您的使用,如果您有什么好的建议,请 QQ 我!
  129. ECHO.
  130. ECHO.
  131. ECHO 请按任意键返回主菜单. . .
  132. PAUSE >NUL
  133. GOTO BEGIN
复制代码
使用过程中发现将批量文件制作成一个压缩包这个功能不支持多级目录。请问应该怎样使这个批处理支持多级目录呢?
例如我要压缩a文件夹成为a.cab,而a文件夹的结构如下:
a文件夹
   |-b文件夹
      |-c文件

我自己写了一个代码:
  1. @echo off
  2. SET C0=MAKECAB /D CompressionType=LZX /D CompressionMemory=21 /D MaxDiskSize=CDROM /D Cabinet=ON /D Compress=ON /D FolderSizeThreshold=5000000
  3. SET /P Ds=请输入需压缩的文件所在的目录名:
  4. SET /P FCab=请输入需要保存的压缩包文件名:
  5. SET C=%C0% /D DiskDirectoryTemplate=.\ /D CabinetNameTemplate=%FCab%
  6. for /f "delims=" %%a in ('dir /s /b /a-d "%Ds%"') do (
  7.       echo %%a >>tmp.log
  8. )
  9. %C% /F tmp.log
  10. 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

  1. :利用MAKECAB压缩目录,且保留目录结构。
  2. :用法:直接把目录拖到此批处理图标上。
  3. :特点:甲、一次只支持一个目录,乙、最外层目录会剥离,
  4. :   丙、目录名直接作为压缩名,丁、不压缩空目录。
  5. @echo off
  6. if "%~1"=="" goto :eof
  7. setlocal enableDelayedExpansion
  8. cd/d %~dp1
  9. set List=L.lst
  10. cd.>%List%
  11. dir/b/a-d "%~f1">>%List%
  12. for /f "delims=" %%d in ('dir/s/b/ad "%~f1"')do (
  13.  set D1=%%d
  14.  set D1=!d1:%~f1\=!
  15.  echo=.set DestinationDir=!D1!>>%List%
  16.  for /f "delims=" %%f in ('"dir/b/a-d "%%d" 2>nul"')do echo="%%d\%%f">>%List%
  17. )
  18. makecab /f %List% /d CabinetNameTemplate="..\%~n1.CAB"
  19. rd/s/q disk1
  20. 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     标题: 更改一下

  1. @echo off
  2. if "%~1"=="" goto :eof
  3. setlocal enableDelayedExpansion
  4. cd/d %~dp1
  5. set List=L.lst
  6. cd.>%List%
  7. for /f "delims=" %%f in ('"dir/b/a-d "%~f1" 2>nul"')do echo="%~nx1\%%f">>%List%
  8. for /f "delims=" %%d in ('dir/s/b/ad "%~f1"')do (
  9.  set D1=%%d
  10.  set D1=!d1:%~f1\=!
  11.  echo=.set DestinationDir=!D1!>>%List%
  12.  for /f "delims=" %%f in ('"dir/b/a-d "%%d" 2>nul"')do echo="%%d\%%f">>%List%
  13. )
  14. makecab /f %List% /d CabinetNameTemplate="..\%~n1.CAB"
  15. rd/s/q disk1
  16. 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

  1. @Echo off&SetLocal EnableDelayedExpansion
  2. ::单文件压缩
  3. makecab /v3 /D CompressionType=LZX /D CompressionMemory=21 "%~1"&set "x=%~1"&set x=!x:~0,-1!&ren "!x!_" "%~n1.cab"
复制代码
  1. ::多文件压缩
  2. @Echo off&SetLocal EnableDelayedExpansion
  3. for /f "delims=" %%f in ('dir /a-d/b "%~f1"')do echo "%~f1\%%f">>list.txt
  4. for /f "delims=" %%d in ('dir/s/b/ad "%~f1"')do (
  5.  set D1=%%d
  6.  set D1=!d1:%~f1\=!
  7.  echo=.set DestinationDir=!D1!>>list.txt
  8.  for /f "delims=" %%f in ('"dir/b/a-d "%%d" 2>nul"')do echo "%%d\%%f">>list.txt
  9. )
  10. makecab /f list.txt /d expresstype=mszip /d expressmemory=21 /d maxdisksize=1024000000 /d diskdirectorytemplate="%~dp1." /d cabinetnametemplate=".\%~n1.cab"
  11. del/a/f/q setup.inf setup.rpt list.txt
复制代码





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