求助:NSIS中$TEMP路径与Windows%TEMP%变量不匹配如何解决?
解决NSIS $TEMP变量指向短路径导致的下载错误
一、$TEMP变量的定义位置
NSIS的$TEMP变量默认读取的是Windows系统的8.3短路径格式临时目录,这个行为是NSIS为兼容早期系统保留的,并非版本bug——哪怕升级到3.08,默认逻辑也没变。
二、修复方法
有三种实用的修复方式:
- 调用API获取长路径临时目录:通过Windows内核函数获取标准长路径,替换默认的
$TEMP值,这是最通用的方案:!include "WinMessages.nsh" Var LongTempPath Function .onInit ; 调用GetTempPathW获取Unicode格式的长路径临时目录 System::Call 'kernel32::GetTempPathW(i ${NSIS_MAX_STRLEN}, t.r0)' StrCpy $LongTempPath $0 ; 替换$TEMP为正确的长路径 StrCpy $TEMP $LongTempPath FunctionEnd - 手动指定临时路径:如果是测试或特定环境,可以直接硬编码正确路径:
StrCpy $TEMP "C:\Users\jsmithy\AppData\Local\Temp" - 启用Unicode编译:在脚本开头添加
Unicode True声明(NSIS 3.x默认支持Unicode),部分场景下能让变量自动优先使用长路径。
三、短路径(JSMITH~1)的来源
这种JSMITH~1格式是Windows的8.3短路径命名规则,早年为兼容DOS/16位程序而生,系统会自动给长文件名生成对应的短路径。但Windows 10及以后,默认可能不再为用户目录自动生成短路径,或者当前用户目录创建时未生成短路径,导致NSIS读取的短路径实际不存在,最终触发“copy failed”错误。
内容的提问来源于stack exchange,提问作者Natalie E
相关产品推荐
相关产品推荐

