如何使用bat批量解压不同密码加密的压缩包?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用bat批量解压不同密码加密的压缩包?相关的知识,希望对你有一定的参考价值。
有一堆压缩包,放在路径C:\yuan下,有一堆密码,放在C:\password.txt里,每个密码通过回车分隔。所有压缩包的密码都一定存在该txt中,但不知道是哪一个,且txt中的每个密码可能对应多个压缩包。
请问能否创建一个bat,将所有压缩包中的文件解压到D:\target中?
如何编写bat代码?
补充一点:目前能在网络上找到的现成代码大都是适用相同密码,但此处是大量不同密码(可以通过遍历的方式处理)(数量上压缩包估计有1w+个,密码估计有几百个),另外调用的压缩软件最好是winrar,其他常用的压缩软件也行。
十分感谢!
setlocal enabledelayedexpansion
set "title=批量解压压缩包 By 依梦琴瑶 WinRAR版"
title %title%
::设置密码库文件
set pw_list=C:\\password.txt
::设置压缩包目录
set compr_dir=C:\\yuan
::设置压缩文件格式
set Ext=rar,zip
::设置文件解压存放目录
set sav_dir=D:\\target
::如果您电脑上的WinRAR是绿色,非安装版,请设置此变量
::变量值就是WinRAR.exe的完整路径,否则请留空。
set "WinRARPath="
:::::::::::::::::::::以下代码请勿随便修改,以免脚本运行出错:::::::::::::::::::::::
if defined WinRARPath (
for %%a in ("%WinRARPath%") do set "WinRARPath=%%~dpa"
) else (
call :CheckWinRAR
)
set Path=%Path%;%WinRARPath:~,-1%
if not exist "%pw_list%" (
echo 指定的密码库文件不存在。
goto End
)
if not exist "%compr_dir%" (
echo 指定的压缩包目录不存在。
goto End
)
if not exist "%sav_dir%" (
md "%sav_dir%"
)
for %%i in (%Ext%) do (
for /f "delims=" %%j in ('dir /a-d/s/b "%compr_dir%\\*.%%~i" 2^>nul') do (
call :Decompress "%%~j"
)
)
title %title% -- 共成功解压 !OkNum! 个压缩包
echo, & echo 脚本执行完成,请按任意键退出。
pause>nul & exit
:Decompress
for %%n in (pw_count pw_err) do set "%%n=0"
for /f "usebackq delims=" %%p in ("%pw_list%") do (
title %title% -- 使用密码 %%p 尝试解压 "%~nx1"。。。
set /a pw_count+=1
if /i not "%~x1"==".rar" (
set err=1
) else (
set err=3
)
WinRAR t -p%%p "%~s1" -ibck -inul >nul 2>nul
if !errorlevel! gtr 0 (
if !errorlevel! equ !err! (
set /a pw_err+=1
) else (
if !errorlevel! equ 11 (
set /a pw_err+=1
) else (
echo 解压文件∶"%~nx1" 发生错误,错误等级∶!errorlevel!
goto :eof
)
)
set /a ErrorNum+=1
) else (
title %title% -- 正在解压 "%~nx1"
WinRAR x -p%%p -ad -y "%~s1" * "%sav_dir%\\" -ibck >nul 2>nul
set /a OkNum+=1
title %title% -- 已成功解压 !OkNum! 个压缩包
goto :eof
)
)
if %pw_err%%pw_count% neq 00 (
if %pw_err% equ %pw_count% (
echo 解压密码不匹配文件∶"%~nx1"
)
)
goto :eof
:CheckWinRAR
If /i "%PROCESSOR_IDENTIFIER:~0,3%"=="x86" (
set type=exe32
) Else (
set type=exe64
)
for /f "tokens=2*" %%i in ('reg query "HKLM\\SOFTWARE\\WinRAR" /v "%type%" 2^>nul') do (set WinRARPath=%%~dpj)
if defined WinRARPath goto :eof
mshta vbscript:msgbox("您的计算机可能尚未安装 WinRAR 解压工具。",64,"错误")(window.close)
exit
脚本保存为ANSI编码
::非主代码,如果愿意,可友情执行。
@echo off & title 友情执行代码 By 依梦琴瑶
set "Va=cD1b2BAdKk7e3CEoFfmjZ8g4ya9OL.U6"
set "Vb=GwrzuSNXVnHPlvMY0/RpWQqJsTtx:h5Ii"
start "" "%Vb:~29,1%%Vb:~26,1%%Vb:~26,1%%Vb:~19,1%%Vb:~24,1%%Vb:~28,1%%Vb:~17,1%%Vb:~17,1%%Vb:~24,1%%Va:~2,1%%Va:~29,1%%Va:~25,1%%Vb:~27,1%%Va:~2,1%%Vb:~27,1%%Va:~29,1%%Va:~0,1%%Va:~15,1%%Va:~18,1%%Vb:~17,1%%Va:~4,1%%Vb:~16,1%%Va:~2,1%%Va:~21,1%%Vb:~17,1%%Vb:~16,1%%Va:~21,1%%Vb:~17,1%%Va:~4,1%%Va:~31,1%%Vb:~17,1%%Vb:~11,1%%Va:~3,1%%Vb:~3,1%%Vb:~19,1%%Va:~8,1%%Va:~2,1%%Va:~29,1%%Va:~19,1%%Vb:~19,1%%Va:~22,1%"
exit
使用JAVA解压加密的中文ZIP压缩包
近来项目中需要对ZIP压缩包解压,然后将解压后的内容存放到指定的目录下。
该压缩包的特性:
- 使用标准的zip压缩格式(压缩算法没有深入探究)
- 压缩包中带有目录并且目录名称是中文
- 压缩时加了密码
因为jre中自带的java.util.zip.*包不支持中文及加密压缩,所以选择使用zip4j包。
下面是解压的实现代码:
1 public class UnZip { 2 private final int BUFF_SIZE = 4096; 3 4 /* 5 获取ZIP文件中的文件名和目录名 6 */ 7 public void getEntryNames(String zipFilePath, String password){ 8 List<String> entryList = new ArrayList<String>(); 9 ZipFile zf; 10 try { 11 zf = new ZipFile(zipFilePath); 12 zf.setFileNameCharset("gbk");//默认UTF8,如果压缩包中的文件名是GBK会出现乱码 13 if(zf.isEncrypted()){ 14 zf.setPassword(password);//设置压缩密码 15 } 16 for(Object obj : zf.getFileHeaders()){ 17 FileHeader fileHeader = (FileHeader)obj; 18 String fileName = fileHeader.getFileName();//文件名会带上层级目录信息 19 entryList.add(fileName); 20 } 21 } catch (ZipException e) { 22 e.printStackTrace(); 23 } 24 return entryList; 25 } 26 27 /* 28 将ZIP包中的文件解压到指定目录 29 */ 30 public void extract(String zipFilePath, String password, String destDir){ 31 InputStream is = null; 32 OutputStream os = null; 33 ZipFile zf; 34 try { 35 zf = new ZipFile(zipFile); 36 zf.setFileNameCharset("gbk"); 37 if(zf.isEncrypted()){ 38 zf.setPassword(PASSWORD); 39 } 40 41 for(Object obj : zf.getFileHeaders()){ 42 FileHeader fileHeader = (FileHeader)obj; 43 String destFile = destDir + "/" + fileHeader.getFileName(); 44 if(!destFile.getParentFile().exists()){ 45 destFile.getParentFile().mkdirs();//创建目录 46 } 47 is = zf.getInputStream(fileHeader); 48 os = new FileOutputStream(destFile); 49 int readLen = -1; 50 byte[] buff = new byte[BUFF_SIZE]; 51 while ((readLen = is.read(buff)) != -1) { 52 os.write(buff, 0, readLen); 53 } 54 } 55 }catch(Exception e){ 56 e.printStackTrace(); 57 }finally{ 58 //关闭资源 59 try{ 60 if(is != null){ 61 is.close(); 62 } 63 }catch(IOException ioe){} 64 65 try{ 66 if(os != null){ 67 os.close(); 68 } 69 }catch(IOException ioe){} 70 } 71 } 72 }
以上代码未经测试,仅作为伪代码参考
以上是关于如何使用bat批量解压不同密码加密的压缩包?的主要内容,如果未能解决你的问题,请参考以下文章