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

[文件操作] 求助批处理批量将7z压缩包转换为zip压缩包

  1. @echo on
  2. setlocal enabledelayedexpansion
  3. :pw
  4. echo. 读取文本密码
  5. for /f "delims=" %%x in ('TYPE pw.txt')do (
  6. set pw=%%x
  7. )
  8. :chpw
  9. echo. 7z转换zip
  10. path "%ProgramFiles%\7-Zip";%path%
  11. for /f "delims=" %%i in ('dir /b /s /a-d *.7z') do (
  12.     7z x "%%i" -o"%~dp0~Tmp" -r -y -aos -p!pw!
  13.     7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
  14. )
  15. rd ~Tmp /s /q
复制代码
如果压缩包无密码 转换正常,有密码则转换失败??求解...

刚刚试了下,有密码也没问题啊!
建议你看下转换失败的,到底有没有解压成功?"%~dp0~Tmp"这个目录有没有解压的文件

TOP

回复 2# fzp070


    我测试 单个密码只传递一次没问题 多个密码貌似就没法正常转换了

TOP

  1. @echo on
  2. setlocal enabledelayedexpansion
  3. :pw
  4. echo. 读取文本密码
  5. for /f "delims=" %%x in ('TYPE pw.txt')do (
  6. set pw=%%x
  7. )
  8. :chpw
  9. echo. 7z转换zip
  10. path "%ProgramFiles%\7-Zip";%path%
  11. (
  12. for /f "delims=" %%i in ('dir /b /s /a-d *.7z') do (
  13.     7z x "%%i" -o"%~dp0~Tmp" -r -y -aos
  14.     7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
  15. )
  16. )<pw.txt
  17. rd ~Tmp /s /q
复制代码
微信:flashercs
QQ:49908356

TOP

本帖最后由 fzp070 于 2022-8-17 15:59 编辑

看了下,你的读取密码变量!pw!,只获取到了文本中的最后一个密码,所以会不正确,导致解密并打包zip失败。
我试了下这样子是可以的,但是有个弊端,就是已解压转zip成功,也会将文本所有密码跑完,建议增加一个检查转换成功就切换。
  1. @echo off
  2. echo. 读取文本密码
  3. for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
  4. echo 转换zip完成
  5. pause
  6. exit
  7. :chpw
  8. setlocal enabledelayedexpansion
  9. echo. 7z转换zip
  10. path "%ProgramFiles%\7-Zip";%path%
  11. for /f "delims=" %%i in ('dir /b /s /a-d *.7z') do (
  12.     7z x "%%i" -o"%~dp0~Tmp" -r -y -aos -p!pw! &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
  13. rd ~Tmp /s /q
  14. )
  15. goto :eof
复制代码

TOP

改进一版,解决了7z处理完仍继续跑完密码。
转换过的7z将其移动了"已转换的7z"文件夹内,你可以自行修改下 移动到其它位置或删除或改后缀名 都行。
  1. @echo off
  2. mkdir "%~dp0已转换的7z"
  3. echo. 读取文本密码
  4. for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
  5. echo 运行结束
  6. rd ~Tmp /s /q >nul 2>nul
  7. pause
  8. exit
  9. :chpw
  10. echo. 7z转换zip
  11. path "%ProgramFiles%\7-Zip";%path%
  12. setlocal enabledelayedexpansion
  13. for /f "delims=" %%i in ('dir /b /a-d *.7z') do (set zf=%%i
  14. 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&goto pass
  15. )
  16. goto :eof
  17. :pass
  18. move "!zf!" "%cd%\已转换的7z\"
  19. rd ~Tmp /s /q >nul 2>nul
  20. (for /f "delims=" %%a in ('dir /b /a-d *.7z') do set zf2=%%a)>nul 2>nul
  21. if "%zf2%"=="" goto ok
  22. goto :eof
  23. :ok
  24. echo 【7z转换zip已完成】
  25. pause
  26. exit
复制代码
1

评分人数

    • holley: 乐于助人!不好意思,权限有限。技术 + 1

TOP

回复 6# fzp070
晚上测试发现一个问题,,当我需转换的压缩包一多的时候,会出现zip包里 好几个其它包的文件都有的现象

TOP

回复 4# flashercs
转换zip包还是会出现大部分空文件zip包,没找到原因

TOP

本帖最后由 holley 于 2022-8-18 10:29 编辑

回复 6# fzp070
现在改成这样,基本效果已经有了
  1. @echo off
  2. mkdir "%~dp0已转换的包"
  3. echo. 读取文本密码
  4. for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
  5. exit
  6. :chpw
  7. setlocal enabledelayedexpansion
  8. echo. 7z转换zip
  9. path "%ProgramFiles%\7-Zip";%path%
  10. for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (
  11.     7z x "%%i" -o"%~dp0~Tmp" -r -y -aos -p!pw! &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
  12. set zf=%%i
  13. rd ~Tmp /s /q
  14. )
  15. REM ping 127.1 -w 1000 -n 6 >nul
  16. move "!zf!" "%cd%\已转换的包\"
  17. goto :pass
  18. :pass
  19. rd ~Tmp /s /q >nul 2>nul
  20. (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar') do set zf2=%%a)>nul 2>nul
  21. if "%zf2%"=="" goto ok
  22. goto :eof
  23. :ok
  24. echo 【7z转换zip已完成】
  25. rd ~Tmp /s /q
  26. REM pause
  27. exit
复制代码
现在的问题:1、本来没密码的7z、rar压缩包没自动转换;2、数字密码的压缩包也没自动转换;求解??
改成set zf="%%i"后 所有压缩包都转换成功了,但转移路径又没生效- -

TOP

回复 9# holley
还在线不?我刚试了下,没有问题啊,之前你只设了7z,我刚加上rar也可以啊,没有发现串文件,上传个验证动图你看看
https://wwp.lanzouv.com/iOP2809sbrwd
  1. @echo off
  2. mkdir "%~dp0已转换的7z"
  3. echo. 读取文本密码
  4. for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
  5. cls
  6. color c7
  7. echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
  8. rd ~Tmp /s /q >nul 2>nul
  9. pause
  10. exit
  11. :chpw
  12. echo. 7z转换zip
  13. path "%ProgramFiles%\7-Zip";%path%
  14. setlocal enabledelayedexpansion
  15. for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
  16. 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&goto pass
  17. )
  18. goto :eof
  19. :pass
  20. move "!zf!" "%cd%\已转换的7z\"
  21. rd ~Tmp /s /q >nul 2>nul
  22. (for /f "delims=" %%a in ('dir /b /a-d *.7z') do set zf2=%%a)>nul 2>nul
  23. if "%zf2%"=="" goto ok
  24. goto :eof
  25. :ok
  26. cls
  27. color b1
  28. echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
  29. pause
  30. exit
复制代码

TOP

本帖最后由 fzp070 于 2022-8-18 23:05 编辑

回复 9# holley

建议你用我10楼的代码,什么都别改,复制到txt中保存为bat文件(ANSI编码),然后放在需转换zip的压缩包文件夹内,双击试下会不会出问题。
刚我又加试了加个没密码的7z压缩包,也是可以的。

补充下:在10楼代码的运行最后,第7行cls后,以及第34行ok后,加一个setlocal disabledelayedexpansion,关闭变量延迟。如果后面还会加代码的话,不加代码那不加也没事。

如果说多压缩文件会串文件,那只可能是 有些没解压成功时 就释放了些无效0字节文件在~temp文件夹,那建议你在22行 goto :eof之前与20行之后加上如下代码。
rd ~Tmp /s /q >nul 2>nul

还是重新发份,你就用如下这份代码,什么都不用改,保存为bat试下
  1. @echo off
  2. mkdir "%~dp0已转换的7z"
  3. echo. 读取文本密码
  4. for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
  5. cls
  6. setlocal disabledelayedexpansion
  7. color c7
  8. echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
  9. rd ~Tmp /s /q >nul 2>nul
  10. TIMEOUT /T 3 /NOBREAK
  11. exit
  12. :chpw
  13. echo. 7z转换zip
  14. path "%ProgramFiles%\7-Zip";%path%
  15. setlocal enabledelayedexpansion
  16. for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
  17. 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&goto pass
  18. rd ~Tmp /s /q >nul 2>nul
  19. )
  20. goto :eof
  21. :pass
  22. move "!zf!" "%cd%\已转换的7z\"
  23. rd ~Tmp /s /q >nul 2>nul
  24. (for /f "delims=" %%a in ('dir /b /a-d *.7z') do set zf2=%%a)>nul 2>nul
  25. if "%zf2%"=="" goto ok
  26. goto :eof
  27. :ok
  28. cls
  29. setlocal disabledelayedexpansion
  30. color b1
  31. echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
  32. TIMEOUT /T 3 /NOBREAK
  33. exit
复制代码

TOP

回复 11# fzp070

附上我的最新测试情况及所用pw.txt,昨天试了半天
临时演示 https://jam.lanzouy.com/b0413ygti 密码:8888

TOP

回复 11# fzp070
  1. @echo off
  2. mkdir "%~dp0已转换的7z"
  3. echo. 读取文本密码
  4. for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
  5. cls
  6. setlocal disabledelayedexpansion
  7. color c7
  8. echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
  9. rd ~Tmp /s /q >nul 2>nul
  10. TIMEOUT /T 3 /NOBREAK
  11. exit
  12. :chpw
  13. echo. 7z转换zip
  14. path "%ProgramFiles%\7-Zip";%path%
  15. setlocal enabledelayedexpansion
  16. for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
  17. 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
  18. rd ~Tmp /s /q >nul 2>nul
  19. )
  20. if not "!zf!"=="" goto pass
  21. goto :eof
  22. :pass
  23. move "!zf!" "%cd%\已转换的7z\"
  24. rd ~Tmp /s /q >nul 2>nul
  25. (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar') do set zf2=%%a)>nul 2>nul
  26. if "%zf2%"=="" goto ok
  27. goto :eof
  28. :ok
  29. cls
  30. setlocal disabledelayedexpansion
  31. color b1
  32. echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
  33. TIMEOUT /T 3 /NOBREAK
  34. exit
复制代码
将你11#21行的goto pass换到循环外if not "!zf!"=="" goto pass ,目前压缩包转移全部生效了,但压缩包转换格式 10个测试包还是有2个未生效- -,pw.txt无特殊字符,相关测试文件都在12楼。

TOP

回复 13# holley

你好,我刚拿你的压缩包和密码试了,确实存在问题,不好意思了,考虑不周全
原因就是相同密码的压缩包,解压成功一次后密码就过掉了,导致另一个相同密码的压缩包未解压成功,已改代码,我这拿你的压缩包试了可以,你再试试
  1. @echo off
  2. mkdir "%~dp0已转换的7z"
  3. echo. 读取文本密码
  4. for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
  5. cls
  6. ::setlocal disabledelayedexpansion
  7. color c7
  8. echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z与rar文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
  9. rd ~Tmp /s /q >nul 2>nul
  10. TIMEOUT /T 3 /NOBREAK
  11. exit
  12. :chpw
  13. echo. 7z转换zip
  14. path "%ProgramFiles%\7-Zip";%path%
  15. setlocal enabledelayedexpansion
  16. for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
  17. 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&move "!zf!" "%cd%\已转换的7z\"
  18. rd ~Tmp /s /q >nul 2>nul
  19. )
  20. (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar') do set zf2=%%a)>nul 2>nul
  21. if "%zf2%"=="" goto ok
  22. goto :eof
  23. :ok
  24. cls
  25. ::setlocal disabledelayedexpansion
  26. color b1
  27. echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
  28. TIMEOUT /T 3 /NOBREAK
  29. exit
复制代码
1

评分人数

    • holley: 十分感谢!技术 + 1

TOP

回复 14# fzp070


    多谢帮助!测试这几个包正常了。我扩大范围试试效果,,,这两天头昏眼花,水平有限,分析不清楚问题原因。

TOP

返回列表