[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理使用 MakeCAB 压缩当前目录(含子目录)下的所有文件

找到了相关的帖子:
http://bbs.bathome.net/viewthread.php?tid=10715
  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%
复制代码
但这个例子是拖拉目录到批处理上,即只处理单个文件夹!

例如:当前目录有一些文件及有两(或N)个文件夹:cfg 和 files
当前目录的 一些文件 忽略,将那两(或N)个文件夹的文件列表:
  1. .set DestinationDir="cfg"
  2. "cfg\filename.ext"
  3. .set DestinationDir="files"
  4. "files\filename.ext"
  5. .set DestinationDir="files\dir"
  6. "files\dir\filename.ext"
  7. .
  8. .
  9. .
复制代码
请帮忙写个批处理,谢谢!

谢谢七哥的解答:
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%e in ('dir /b /on /s /ad 2^>nul') do (
  5. set "str=%%e"
  6. set "str=!str:%cd%\=!"
  7. >>"%~dp0FileList.txt" echo .set DestinationDir="!str!"
  8. pushd "%%e"
  9. for /f "delims=" %%j in ('dir /b /on /a-d 2^>nul') do (
  10. set "str2=%%~fj"
  11. set "str2=!str2:%cd%\=!"
  12. >>"%~dp0FileList.txt" echo "!str2!"
  13. )
  14. popd
  15. )
  16. endlocal
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 8# chishingchan


   已修改,不必每次都评分。
bat小白,请多指教!谢谢!

TOP

回复 7# 77七


   
请问能否将下面 C:\DIR\ 字符去掉?谢谢!
  1. .set DestinationDir=DIR1
  2. "C:\DIR\DIR1\FILE2.txt"
  3. .set DestinationDir=DIR2
  4. "C:\DIR\DIR2\FILE3.txt"
  5. .set DestinationDir=DIR2\DIR3
  6. "C:\DIR\DIR2\DIR3\FILE4.txt"
复制代码

TOP

本帖最后由 77七 于 2023-4-6 19:43 编辑

回复 5# chishingchan
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. for /f "delims=" %%e in ('dir /b /s /ad 2^>nul') do (
  5. set "str=%%e"
  6. set "str=!str:%cd%\=!"
  7. >>"%~dp0L.lst" echo .set DestinationDir=!str!
  8. pushd "%%e"
  9. for /f "delims=" %%j in ('dir /b /a-d 2^>nul') do (
  10. set "str2=%%~fj"
  11. set "str2=!str2:%cd%\=!"
  12. >>"%~dp0L.lst" echo "!str2!"
  13. )
  14. popd
  15. )
  16. for /f "delims=" %%i in ("%~f0\..") do (
  17. makecab /f L.lst /d CabinetNameTemplate="..\%%~nxi.CAB"
  18. )
  19. rd /s /q disk1
  20. del /a /f /q setup.inf;setup.rpt;L.lst
  21. endlocal
  22. pause
复制代码


所以,相当于在压缩一个文件夹,比1楼和2楼代码都省事
或者把当前目录中的所有文件夹移动到一个新文件夹中再用1楼或者2楼代码
1

评分人数

    • chishingchan: 基本上能用,还需要细化,谢谢!技术 + 1
bat小白,请多指教!谢谢!

TOP

本帖最后由 chishingchan 于 2023-4-6 20:40 编辑

回复 4# 77七


    请七哥下载这个附件就明白了,非常谢谢!

TOP

回复 4# 77七


第一个 code 框是 目录、文件结构(例子)
第二个 code 框是需要生成的 最后结果
最后总只生成一个 FileList.txt 文件,并只能生成一个 CAB 才正确。3楼的每个目录都生成 CAB 是不对的。

TOP

回复 3# chishingchan


  我不是很明白,我写的代码和你在一楼贴的批处理代码,生成的文件列表是一致的。
你在3楼贴的列表, 是一个列表,还是两个列表贴到一起了?是要把dir1 和dir2 压缩到一起?还是单纯的根据你期待的列表生成就行?
bat小白,请多指教!谢谢!

TOP

回复 2# 77七


    谢谢七哥!但不符合要求,是我说的不清楚,不好意思!



文件及附件我都不能上传,可能权限不足,只能文字表达了:
  1. C:\DIR
  2. │  FileList.cmd 批处理
  3. │  FileList.txt   批处理生成的文件
  4. │  FILE1.TXT   与批处理同目录的所有文件都被忽略
  5. ├─DIR1
  6. │  └─FILE2.TXT
  7. └─DIR2
  8.     ├─FILE3.TXT
  9.     └─DIR3
  10.         └─FILE4.TXT
复制代码
生成的列表文件应该是下面的样子:FileList.txt
  1. .set DestinationDir="DIR1"
  2. "DIR1\FILE2.txt"
  3. .set DestinationDir="DIR2"
  4. "DIR2\FILE3.txt"
  5. .set DestinationDir="DIR2\DIR3"
  6. "DIR2\DIR3\FILE4.txt"
复制代码
希望七哥再助力,谢谢!

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. for /f "delims=" %%d in ('dir /b /ad') do (
  5. for /f "delims=" %%i in ('dir /b /a-d "%%d" 2^>nul') do (
  6. >>"%~dp0L.lst" echo "%%~nxd\%%~nxi"
  7. )
  8. for /f "delims=" %%e in ('dir /b /s /ad "%%d" 2^>nul') do (
  9. set "str=%%e"
  10. set "str=!str:%%~fd\=!"
  11. >>"%~dp0L.lst" echo .set DestinationDir=!str!
  12. pushd "%%e"
  13. for /f "delims=" %%j in ('dir /b /a-d 2^>nul') do (
  14. >>"%~dp0L.lst" echo "%%~fj"
  15. )
  16. popd
  17. )
  18. makecab /f L.lst /d CabinetNameTemplate="..\%%~nxd.CAB"
  19. rd /s /q disk1
  20. del /a /f /q setup.inf;setup.rpt;L.lst
  21. )
  22. endlocal
  23. pause
复制代码

压缩当前目录下的文件夹,每个文件夹单独压缩
1

评分人数

bat小白,请多指教!谢谢!

TOP

返回列表