标题: [文件操作] 求助批处理批量将7z压缩包转换为zip压缩包 [打印本页]
作者: holley 时间: 2022-8-16 13:05 标题: 求助批处理批量将7z压缩包转换为zip压缩包
- @echo on
- setlocal enabledelayedexpansion
- :pw
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (
- set pw=%%x
- )
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- for /f "delims=" %%i in ('dir /b /s /a-d *.7z') do (
- 7z x "%%i" -o"%~dp0~Tmp" -r -y -aos -p!pw!
- 7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
- )
- 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
- @echo on
- setlocal enabledelayedexpansion
- :pw
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (
- set pw=%%x
- )
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- (
- for /f "delims=" %%i in ('dir /b /s /a-d *.7z') do (
- 7z x "%%i" -o"%~dp0~Tmp" -r -y -aos
- 7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
- )
- )<pw.txt
- rd ~Tmp /s /q
复制代码
作者: fzp070 时间: 2022-8-17 14:57
本帖最后由 fzp070 于 2022-8-17 15:59 编辑
看了下,你的读取密码变量!pw!,只获取到了文本中的最后一个密码,所以会不正确,导致解密并打包zip失败。
我试了下这样子是可以的,但是有个弊端,就是已解压转zip成功,也会将文本所有密码跑完,建议增加一个检查转换成功就切换。- @echo off
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- echo 转换zip完成
- pause
- exit
-
- :chpw
- setlocal enabledelayedexpansion
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- for /f "delims=" %%i in ('dir /b /s /a-d *.7z') do (
- 7z x "%%i" -o"%~dp0~Tmp" -r -y -aos -p!pw! &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
- rd ~Tmp /s /q
- )
- goto :eof
复制代码
作者: fzp070 时间: 2022-8-17 18:04
改进一版,解决了7z处理完仍继续跑完密码。
转换过的7z将其移动了"已转换的7z"文件夹内,你可以自行修改下 移动到其它位置或删除或改后缀名 都行。- @echo off
- mkdir "%~dp0已转换的7z"
-
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- echo 运行结束
- rd ~Tmp /s /q >nul 2>nul
- pause
- exit
-
-
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.7z') do (set zf=%%i
- 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&goto pass
- )
- goto :eof
-
-
- :pass
- move "!zf!" "%cd%\已转换的7z\"
- rd ~Tmp /s /q >nul 2>nul
-
- (for /f "delims=" %%a in ('dir /b /a-d *.7z') do set zf2=%%a)>nul 2>nul
- if "%zf2%"=="" goto ok
- goto :eof
-
-
- :ok
- echo 【7z转换zip已完成】
- pause
- 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
现在改成这样,基本效果已经有了- @echo off
- mkdir "%~dp0已转换的包"
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- exit
-
- :chpw
- setlocal enabledelayedexpansion
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (
- 7z x "%%i" -o"%~dp0~Tmp" -r -y -aos -p!pw! &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
- set zf=%%i
- rd ~Tmp /s /q
- )
- REM ping 127.1 -w 1000 -n 6 >nul
- move "!zf!" "%cd%\已转换的包\"
- goto :pass
-
-
- :pass
- rd ~Tmp /s /q >nul 2>nul
-
- (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar') do set zf2=%%a)>nul 2>nul
- if "%zf2%"=="" goto ok
- goto :eof
-
-
- :ok
- echo 【7z转换zip已完成】
- rd ~Tmp /s /q
- REM pause
- exit
复制代码
现在的问题:1、本来没密码的7z、rar压缩包没自动转换;2、数字密码的压缩包也没自动转换;求解??
改成set zf="%%i"后 所有压缩包都转换成功了,但转移路径又没生效- -
作者: fzp070 时间: 2022-8-18 21:51
回复 9# holley
还在线不?我刚试了下,没有问题啊,之前你只设了7z,我刚加上rar也可以啊,没有发现串文件,上传个验证动图你看看
https://wwp.lanzouv.com/iOP2809sbrwd- @echo off
- mkdir "%~dp0已转换的7z"
-
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- cls
- color c7
- echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
- rd ~Tmp /s /q >nul 2>nul
- pause
- exit
-
-
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
- 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&goto pass
- )
- goto :eof
-
-
- :pass
- move "!zf!" "%cd%\已转换的7z\"
- rd ~Tmp /s /q >nul 2>nul
-
- (for /f "delims=" %%a in ('dir /b /a-d *.7z') do set zf2=%%a)>nul 2>nul
- if "%zf2%"=="" goto ok
- goto :eof
-
-
- :ok
- cls
- color b1
- echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
- pause
- 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试下- @echo off
- mkdir "%~dp0已转换的7z"
-
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- cls
- setlocal disabledelayedexpansion
- color c7
- echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
- rd ~Tmp /s /q >nul 2>nul
- TIMEOUT /T 3 /NOBREAK
- exit
-
-
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
- 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&goto pass
- rd ~Tmp /s /q >nul 2>nul
- )
- goto :eof
-
-
- :pass
- move "!zf!" "%cd%\已转换的7z\"
- rd ~Tmp /s /q >nul 2>nul
-
- (for /f "delims=" %%a in ('dir /b /a-d *.7z') do set zf2=%%a)>nul 2>nul
- if "%zf2%"=="" goto ok
- goto :eof
-
-
- :ok
- cls
- setlocal disabledelayedexpansion
- color b1
- echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
- TIMEOUT /T 3 /NOBREAK
- 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 - @echo off
- mkdir "%~dp0已转换的7z"
-
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- cls
- setlocal disabledelayedexpansion
- color c7
- echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
- rd ~Tmp /s /q >nul 2>nul
- TIMEOUT /T 3 /NOBREAK
- exit
-
-
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
- 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel
- rd ~Tmp /s /q >nul 2>nul
- )
- if not "!zf!"=="" goto pass
- goto :eof
-
-
- :pass
- move "!zf!" "%cd%\已转换的7z\"
- rd ~Tmp /s /q >nul 2>nul
-
- (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar') do set zf2=%%a)>nul 2>nul
- if "%zf2%"=="" goto ok
- goto :eof
-
-
- :ok
- cls
- setlocal disabledelayedexpansion
- color b1
- echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
- TIMEOUT /T 3 /NOBREAK
- exit
复制代码
将你11#21行的goto pass换到循环外if not "!zf!"=="" goto pass ,目前压缩包转移全部生效了,但压缩包转换格式 10个测试包还是有2个未生效- -,pw.txt无特殊字符,相关测试文件都在12楼。
作者: fzp070 时间: 2022-8-19 14:52
回复 13# holley
你好,我刚拿你的压缩包和密码试了,确实存在问题,不好意思了,考虑不周全
原因就是相同密码的压缩包,解压成功一次后密码就过掉了,导致另一个相同密码的压缩包未解压成功,已改代码,我这拿你的压缩包试了可以,你再试试- @echo off
- mkdir "%~dp0已转换的7z"
-
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- cls
- ::setlocal disabledelayedexpansion
- color c7
- echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z与rar文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
- rd ~Tmp /s /q >nul 2>nul
- TIMEOUT /T 3 /NOBREAK
- exit
-
-
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar') do (set zf=%%i
- 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%%~dpni.zip" "%~dp0~Tmp\*" -y -sdel &&move "!zf!" "%cd%\已转换的7z\"
- rd ~Tmp /s /q >nul 2>nul
- )
- (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar') do set zf2=%%a)>nul 2>nul
- if "%zf2%"=="" goto ok
- goto :eof
-
-
- :ok
- cls
- ::setlocal disabledelayedexpansion
- color b1
- echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
- TIMEOUT /T 3 /NOBREAK
- 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,你试下- @echo off
- mkdir "%~dp0原压缩包"
-
- echo. 读取文本密码
- for /f "delims=" %%x in ('TYPE pw.txt')do (set pw=%%x &call :chpw)
-
- cls
- ::setlocal disabledelayedexpansion
- color c7
- echo.&echo.&echo 运行结束,如有剩余【未解压转换zip】的7z与rar文件,请检查密码的正确性,以及密码是否含""引号 &echo.&echo.
- rd ~Tmp /s /q >nul 2>nul
- TIMEOUT /T 3 /NOBREAK
- exit
-
-
- :chpw
- echo. 7z转换zip
- path "%ProgramFiles%\7-Zip";%path%
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.7z *.rar *.zip') do (set zf=%%i
- 7z x "!zf!" -p!pw! -o"%~dp0~Tmp" -aoa &&7z a "%cd%\已转换zip\%%~ni.zip" "%~dp0~Tmp\*" -y -sdel &&move "!zf!" "%cd%\原压缩包\"
- rd ~Tmp /s /q >nul 2>nul
- )
- (for /f "delims=" %%a in ('dir /b /a-d *.7z *.rar *.zip') do set zf2=%%a)>nul 2>nul
- if "%zf2%"=="" goto ok
- goto :eof
-
-
- :ok
- cls
- ::setlocal disabledelayedexpansion
- color b1
- echo.&echo.&echo 【7z转换zip已全部完成】&echo.&echo.
- TIMEOUT /T 3 /NOBREAK
- 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 |