NSIS v3.08中使用nsUnzip插件持续返回错误码9的问题排查求助
解决NSIS 3.08中nsUnzip插件返回错误码9的问题
结合你描述的现象——NSIS 2.46正常运行、FileOpen能找到文件但插件持续返回错误码9,这大概率是NSIS版本升级后的插件兼容性或路径处理差异导致的,你可以从这几个方向排查:
1. 确认nsUnzip插件是否适配NSIS 3.x
NSIS 3.x对插件API做了不少更新,针对NSIS 2.x编译的旧版nsUnzip插件,可能无法正确处理NSIS 3的参数传递、路径解析逻辑。你需要:
- 替换为专门为NSIS 3编译的nsUnzip插件版本;
- 严格匹配编码模式:如果脚本里加了
Unicode true,必须使用Unicode编译的插件DLL,否则字符串传递会乱码,导致插件解析路径错误,触发"文件未找到"的错误码9。
2. 检查NSIS 3的插件加载路径
NSIS 3的插件目录逻辑和NSIS 2略有差异,确保插件DLL放在正确位置:
- 若插件放在脚本本地,需在脚本开头用
!addplugindir指定插件目录,比如:!addplugindir "${NSISDIR}\Plugins\x86-unicode" - 或者直接将插件DLL复制到NSIS安装目录下的
Plugins\x86-ansi或x86-unicode文件夹(对应你的脚本编码模式),确保NSIS能正确加载到插件。
3. 验证路径传递的正确性
虽然FileOpen能正常识别路径,但nsUnzip插件对路径的处理可能和NSIS内置命令有差异:
- 尝试使用绝对路径传递给nsUnzip,先用
GetFullPathName把相对路径转成绝对路径:GetFullPathName "your_archive.zip" $0 nsUnzip::Extract "$0" "target_dir" - 用
MessageBox MB_OK "$0"或DetailPrint "$0"输出路径,确认和FileOpen使用的路径完全一致,避免因空格、特殊字符转义问题导致插件识别失败。
4. 开启NSIS 2兼容模式
NSIS 3提供了兼容NSIS 2的选项,你可以在脚本开头添加:
!define NSIS_LEGACY_V2_COMPAT
某些旧插件依赖NSIS 2的行为模式,开启兼容后可能解决路径解析的问题。
5. 简化脚本调试
如果以上方法都无效,建议简化脚本排查:
- 只保留nsUnzip的核心调用逻辑,排除其他代码的干扰;
- 换一个简单的测试压缩包(比如仅包含1-2个文件的zip),排除压缩包本身的格式问题;
- 在调用nsUnzip前后用
DetailPrint输出所有参数,确认传递的路径和目标目录无误。
内容的提问来源于stack exchange,提问作者080068
相关产品推荐
相关产品推荐

