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

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

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,万分感谢!

上传3个文件夹和3个压缩包没什么意义...
日志文件相比来说更需要说明,请给个示例
bat小白,请多指教!谢谢!

TOP

回复 2# 77七

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


就类似这种的日志格式,大致上差不多就行

TOP

回复 2# 77七


    再补充下,只要A路径下的子文件夹,每个子文件夹及下面的文件+文件夹都打包成一个压缩包即可(不考虑再下一层子还是否有子文件夹的情况)。

TOP

回复 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
复制代码
bat小白,请多指教!谢谢!

TOP

  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. ))>%~dp0LOG.txt
  16. popd
  17. start "" LOG.txt
  18. exit/b
复制代码

TOP


在任何一个复合语块(如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
复制代码

TOP

回复 7# aloha20200628

if errorlevel 0 如何证明 errorlevel 会被预赋值为零

TOP

回复 8# buyiyang

试试7楼的代码运行结果,应该总是显示‘成功’,除非在for之前errorlevel已被赋予非零值...

TOP

TOP

本帖最后由 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,解压失败
复制代码

TOP

站长前几天刚讲过(跳转),不过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
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-8-2 10:38 编辑


这个 errorlevel 还真是有趣...
但用过7楼代码的试者可知》无论 rar.exe 在循环体内的每次真实返回值如何,echo显示均为'成功',因此用此法判断 rar.exe ‘解压失败’ 是无效的。
     不知 5-6楼 认可这个推论吗?

TOP

本帖最后由 qixiaobin0715 于 2024-8-2 10:39 编辑

回复 12# 77七
不是太懂,记得以前看过%errorlevel%取值范围是0~255,你这里的代码是强制定义了环境变量?-1换成10000%errorlevel%的值就是10000,不知道实际应用上有何作用。

TOP

本帖最后由 qixiaobin0715 于 2024-8-2 10:55 编辑

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

TOP

返回列表