You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:45:30