多类公开方案无效:遍历密码列表用PowerShell+7-Zip解压加密包求助
现有脚本的核心问题定位
- 7-Zip命令行参数格式不匹配:7z 的解压逻辑中,目标输出目录必须携带
-o前缀,原脚本将输出路径作为位置参数直接传递,会被程序识别为待解压的附加文件,完全无法实现定向输出 - 密码参数语法错误:原代码编写的
-p"{password}"既缺少变量引用必需的$符号,也没有正确拼接变量值,实际传递给7z的密码是字面量字符串{password},永远无法匹配有效密码 - 运行结果判断逻辑失效:PowerShell 中执行原生命令时,
$?仅判断命令进程是否成功启动,不会捕获7z自身的运行退出码;7z 的实际运行结果需要读取$LASTEXITCODE变量判断(返回0代表执行成功,返回2代表密码错误、校验失败等运行类错误) - JSON解析逻辑偏差:JDownloader 的密码列表文件为嵌套结构,并非根节点直接存储密码数组,直接遍历JSON根节点会拿到对象属性而非单个可尝试的密码字符串
- 循环退出逻辑反向:原脚本判断到单步解压失败就直接终止整个程序,完全不会遍历下一个候选密码;正确逻辑应为单密码尝试失败后自动跳过,依次遍历所有候选值,直到匹配到正确密码触发成功逻辑
- 别名绑定稳定性不足:使用
Set-Alias指向7z.exe时,部分PowerShell版本会出现参数解析偏移的问题,直接存储可执行文件全路径调用的可靠性更高
可直接运行的修正版脚本
# 定义7-Zip可执行文件全路径 $szExePath = Join-Path ${env:ProgramFiles} "7-Zip\7z.exe" # 定义待解压的加密压缩包路径 $zipfilePath = "D:\NEU\CP 77 M2\CP.77_M2.part01.rar" # 读取JDownloader密码列表文件,Raw模式避免多行读取导致的JSON解析失败 $pwdListRaw = Get-Content "C:\JDownloader v2.0\cfg\org.jdownloader.extensions.extraction.ExtractionExtension.passwordlist.json" -Raw $pwdListObj = $pwdListRaw | ConvertFrom-Json # 提取实际存储的密码数组(根据JDownloader实际文件结构调整对应键名,常规存储在passwords字段下) $passwords = $pwdListObj.passwords # 定义解压输出目录,取压缩包所在的父目录 $destinationUnzipPath = Split-Path $zipfilePath -Parent # 遍历所有候选密码依次尝试 foreach ($password in $passwords) { Write-Host "正在尝试候选密码: $password" # 调用7z执行解压,关闭冗余输出避免日志干扰 & $szExePath x $zipfilePath "-o$destinationUnzipPath" "-p$password" -y -bso0 -bsp0 # 根据7z实际退出码判断执行结果 if ($LASTEXITCODE -eq 0) { Write-Host "解压成功,匹配密码为: $password" [console]::beep(500,300) # 解压成功后终止遍历 break } }
关键参数说明
-y:对7z弹出的所有确认提示自动选择“是”,避免程序卡在交互等待环节-bso0 -bsp0:关闭标准输出和进度条日志,减少冗余信息干扰调试"-o$destinationUnzipPath":将输出目录参数和-o前缀拼接为整体字符串,规避路径包含空格时的参数拆分错误"-p$password":将密码参数和-p前缀拼接为整体字符串,规避密码本身包含空格、特殊符号时的参数解析错误
内容的提问来源于stack exchange,提问作者Dennis Kassel
相关产品推荐
相关产品推荐

