Board logo

标题: [文件操作] 求助批处理批量将7z压缩包转换为zip压缩包 [打印本页]

作者: holley    时间: 2022-8-16 13:05     标题: 求助批处理批量将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
复制代码
如果压缩包无密码 转换正常,有密码则转换失败??求解...
作者: fzp070    时间: 2022-8-16 22:28

刚刚试了下,有密码也没问题啊!
建议你看下转换失败的,到底有没有解压成功?"%~dp0~Tmp"这个目录有没有解压的文件
作者: holley    时间: 2022-8-17 09:04

回复 2# fzp070


    我测试 单个密码只传递一次没问题 多个密码貌似就没法正常转换了
作者: flashercs    时间: 2022-8-17 13:24

  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
复制代码

作者: fzp070    时间: 2022-8-17 14:57

本帖最后由 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
复制代码

作者: fzp070    时间: 2022-8-17 18:04

改进一版,解决了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
复制代码

作者: holley    时间: 2022-8-18 08:24

回复 6# fzp070
晚上测试发现一个问题,,当我需转换的压缩包一多的时候,会出现zip包里 好几个其它包的文件都有的现象
作者: holley    时间: 2022-8-18 08:51

回复 4# flashercs
转换zip包还是会出现大部分空文件zip包,没找到原因
作者: holley    时间: 2022-8-18 09:58

本帖最后由 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"后 所有压缩包都转换成功了,但转移路径又没生效- -

作者: fzp070    时间: 2022-8-18 21:51

回复 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
复制代码

作者: fzp070    时间: 2022-8-18 22:06

本帖最后由 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
复制代码

作者: holley    时间: 2022-8-19 11:04

回复 11# fzp070

附上我的最新测试情况及所用pw.txt,昨天试了半天
临时演示 https://jam.lanzouy.com/b0413ygti 密码:8888
作者: holley    时间: 2022-8-19 13:41

回复 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楼。
作者: fzp070    时间: 2022-8-19 14:52

回复 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
复制代码

作者: holley    时间: 2022-8-19 15:13

回复 14# fzp070


    多谢帮助!测试这几个包正常了。我扩大范围试试效果,,,这两天头昏眼花,水平有限,分析不清楚问题原因。
作者: fzp070    时间: 2022-8-19 15:19

回复 15# holley


    是我考虑不周全,如果还有问题,你再回复吧。
密码中不要有""引号,如果有引号的就需要另外的解压方法
作者: holley    时间: 2022-8-19 15:46

回复 14# fzp070


    请教:突然想到一种情况,如果本身是zip包但有密码,那么就也需要解压后重新打包,直接调用肯定是有问题的,,我是不是可以在“ok”里针对zip再做1次解压+压缩,还是说可以在前面就做什么判断选择?
作者: fzp070    时间: 2022-8-19 16:39

本帖最后由 fzp070 于 2022-8-19 16:46 编辑

回复 17# holley

抱歉,看错了,以为你说的是压缩包内有压缩包都需要解压。
如果是说zip的话,你可以解压后再解压,不过这样麻烦,最好的方式就是第一次解压并重新打包时放在其它路径,这样就可以一次全解压了。

    解压是默认解第一层吧,从OK里面再解压也只是解压第一层啊。
压缩包里面的压缩包要解压的话,估计你得先读取解压成功的文件夹,如查到有压缩包,就继续解压,比较复杂了,你可以研究下
或者你研究下7z有没针对,压缩包内的压缩包,一次解压的,不过如果密码也不同,就会很复杂吧
作者: fzp070    时间: 2022-8-19 17:06

本帖最后由 fzp070 于 2022-8-19 17:28 编辑

回复 17# holley


    将"%%~dpni.zip" 改成"%cd%\已转换zip\%%~ni.zip",另外for查找范围改成*.7z *.rar *.zip,刚已试OK,你试下
  1. @echo off
  2. mkdir "%~dp0原压缩包"
  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 *.zip') do (set zf=%%i
  17. 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%cd%\已转换zip\%%~ni.zip" "%~dp0~Tmp\*" -y -sdel &&move "!zf!" "%cd%\原压缩包\"
  18. rd ~Tmp /s /q >nul 2>nul
  19. )
  20. (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar *.zip') 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
复制代码

作者: holley    时间: 2022-8-19 17:33

回复 19# fzp070


    我想了一个逻辑:提前将当前所有zip移动到“已转换文件夹”里面,原批处理完成后再对“已转换文件夹”里的所有zip做解压并压缩到上一级目录,这样保证了“已转换文件夹”里面都是源文件,脚本所在都是已转换的无密zip压缩包。
第一步比较简单,第二步写的有点艰难,还在反复测试。
作者: fzp070    时间: 2022-8-19 17:36

回复 20# holley


    19楼已改好了,你试试,支持转换有密码zip 为无密码zip




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