找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 44389|回复: 23

[文件操作] 求助BAT脚本批量压缩文件

[复制链接]
发表于 2024-7-31 15:18:13 | 显示全部楼层 |阅读模式
1、某个路径A下有若干个文件夹,比如
D:\我的文档\桌面\批量压缩文件\实例\A\54434aaaa\1.txt
D:\我的文档\桌面\批量压缩文件\实例\A\76768sdsfe\2.txt
D:\我的文档\桌面\批量压缩文件\实例\A\eaa202121212\3.txt


2、需要bat执行自动压缩,并保存到另一个路径B下,压缩结果如下:
D:\我的文档\桌面\批量压缩文件\实例\B\54434aaaa.zip
D:\我的文档\桌面\批量压缩文件\实例\B\76768sdsfe.zip
D:\我的文档\桌面\批量压缩文件\实例\B\eaa202121212.zip

3、压缩过程中需要添加密码,密码是年月日+指定字符,比如密码是20240731QWEasd
4、压缩过程中把压缩结果输出到指定路径的日志文件里,包含时间、文件名字、源文件的完整路径、压缩结果

示例:链接: https://pan.baidu.com/s/1nZLGJmikGi-udcdweDsY9w 提取码: p4qi
请大佬帮忙写个bat,万分感谢!
发表于 2024-7-31 16:32:23 | 显示全部楼层
上传3个文件夹和3个压缩包没什么意义...
日志文件相比来说更需要说明,请给个示例
 楼主| 发表于 2024-7-31 16:36:47 | 显示全部楼层
回复 2# 77七

压缩过程中把压缩结果输出到指定路径的日志文件里,包含时间、文件名字、源文件的完整路径、压缩结果
XXXX年XX月XX日XX点XX分XX秒,XX路径,XX文件名,压缩成功
XXXX年XX月XX日XX点XX分XX秒,XX路径,XX文件名,压缩失败


就类似这种的日志格式,大致上差不多就行
 楼主| 发表于 2024-7-31 16:45:45 | 显示全部楼层
回复 2# 77七


    再补充下,只要A路径下的子文件夹,每个子文件夹及下面的文件+文件夹都打包成一个压缩包即可(不考虑再下一层子还是否有子文件夹的情况)。
发表于 2024-7-31 18:54:05 | 显示全部楼层
回复 4# 304802301


  
  1. @echo off
  2. rem 保存为ansi
  3. rem 代码使用winrar\下的rar.exe,使用需添加到系统环境变量,或者写明绝对路径
  4. cd /d "%~dp0"
  5. set pwd=QWEasd
  6. set f1=D:\实例_20240731_151654\A
  7. set f2=D:\实例_20240731_151654\C
  8. set log=d:\1.txt

  9. md "%f2%" 2>nul
  10. pushd "%f1%"
  11. call :getdt d
  12. (for /d %%d in (*) do (
  13.         pushd "%%d"
  14.         for /f "delims=" %%a in ('forfiles /s /m * /c "cmd /c if @isdir equ FALSE echo @relpath"') do (
  15.                 call :getdt
  16.                 set /p="%%~dpa,%%~nxa,"<nul
  17.                 rar a "%f2%\%%d.zip" -p%d%%pwd% "%%~a" 1>nul 2>nul
  18.                 if errorlevel 1 (
  19.                         echo 压缩失败
  20.                 ) else (
  21.                         echo 压缩成功
  22.                 )
  23.         )
  24.         popd
  25. ))>>"%log%"
  26. pause
  27. exit

  28.         :getdt
  29.         for /f %%a in ('wmic os get localdatetime ^|findstr [0-9]') do (
  30.                 set t=%%a
  31.         )
  32.         if "%~1" equ "d" (
  33.                 set %~1=%t:~0,4%%t:~4,2%%t:~6,2%
  34.         ) else (
  35.                 set /p="%t:~0,4%年%t:~4,2%月%t:~6,2%日%t:~8,2%时%t:~10,2%分%t:~12,2%秒,"<nul
  36.         )
  37.         exit /b
复制代码
发表于 2024-7-31 21:24:52 | 显示全部楼层
  1. @echo off
  2. set "input=D:\我的文档\桌面\批量压缩文件\实例\A"
  3. set "output=D:\我的文档\桌面\批量压缩文件\实例\B"
  4. rem 采用7zip压缩,请修改为实际路径
  5. set "exe=D:\实际路径\7-Zip\7z.exe"
  6. set "pwd=20240731QWEasd"
  7. pushd %input%
  8. (for /d %%d in (*) do (
  9.         "%exe%" a -p%pwd% -t7z "%output%\%%d.7z" ".\%%d\*" >nul 2>nul
  10.         if errorlevel 1 (
  11.                         echo %DATE% %TIME% %%~fd --- 压缩失败
  12.                 ) else (
  13.                         echo %DATE% %TIME% %%~fd --- 压缩成功
  14.                 )
  15.        
  16. ))>%~dp0LOG.txt
  17. popd
  18. start "" LOG.txt
  19. exit/b
复制代码
发表于 2024-8-1 17:59:47 | 显示全部楼层

在任何一个复合语块(如for或if)中的 %var% 变量均会被预先赋值,errorlevel亦是%var%
例如下式中的 errorlevel 会被预赋值为零,而无视循环体内每次 rar.exe 的真实返回值
假定下式中的 abc.zip, 123.rar 均为不存在的压缩包文件...

  1. @echo off &for %%F in ("abc.zip" "123.rar") do (
  2.         rar.exe x %%F 2>nul >nul
  3.         if errorlevel 0 (echo,解压成功) else echo,解压失败
  4. )
  5. pause&exit/b
复制代码
发表于 2024-8-1 18:36:57 | 显示全部楼层
回复 7# aloha20200628

if errorlevel 0 如何证明 errorlevel 会被预赋值为零
发表于 2024-8-1 19:30:16 | 显示全部楼层
回复 8# buyiyang

试试7楼的代码运行结果,应该总是显示‘成功’,除非在for之前errorlevel已被赋予非零值...
发表于 2024-8-1 20:03:54 | 显示全部楼层
发表于 2024-8-2 08:33:01 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2024-8-2 08:52 编辑

无论是在“复合语块”中还是在外部其它任何位置,判断语句“if errorlevel 0 ...”在任何时候都成立。换句话说,用不用都一样,无任何意义。
7楼代码中:
  1. if errorlevel 0 (echo,解压成功) else echo,解压失败
复制代码
和直接
  1. echo,解压成功
复制代码
效果是一样的。
代码这样写是可以的:
  1. if not errorlevel 1 (echo,解压成功) else echo,解压失败
复制代码
发表于 2024-8-2 09:03:47 | 显示全部楼层
站长前几天刚讲过(跳转),不过errorlevel可为负值,代码设定上应该还是没问题。
  1. @echo off
  2. call :1 -1
  3. if errorlevel 0 (
  4.         echo a
  5. ) else (
  6.         echo b
  7. )
  8. pause
  9. exit
  10.         :1
  11.         exit /b %~1
复制代码
发表于 2024-8-2 10:31:58 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-2 10:38 编辑


这个 errorlevel 还真是有趣...
但用过7楼代码的试者可知》无论 rar.exe 在循环体内的每次真实返回值如何,echo显示均为'成功',因此用此法判断 rar.exe ‘解压失败’ 是无效的。
     不知 5-6楼 认可这个推论吗?
发表于 2024-8-2 10:37:37 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2024-8-2 10:39 编辑

回复 12# 77七
不是太懂,记得以前看过%errorlevel%取值范围是0~255,你这里的代码是强制定义了环境变量?-1换成10000%errorlevel%的值就是10000,不知道实际应用上有何作用。
发表于 2024-8-2 10:43:45 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2024-8-2 10:55 编辑

判断语句 if errorlevel 0 ... 的意思是,如果errorlevel的返回值是大于或等于0,要执行什么命令。
可以在cmd窗口写入:if /? 查询
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 18:02 , Processed in 0.022507 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表