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

在NSIS中如何使用用户变量实现文件重命名或复制操作?

问题原因

你遇到的报错核心是混淆了NSIS的两种变量作用域:

  • ${变量名} 是编译期变量/宏,仅在NSIS编译脚本阶段生效,编译时会直接替换为对应文本
  • $变量名 是运行期变量,通过StrCpy赋值,仅在安装包运行在用户设备时生效,编译阶段无法识别

你当前用StrCpy定义的$originalName是运行期变量,自然无法在编译期执行的File命令中通过${originalName}读取到。

修正方案

有两种常用的实现方式,推荐选择更简洁的方案1:

方案1:直接在File命令中指定输出文件名(无需额外重命名)

直接在打包文件时就指定安装后释放的文件名,省略单独的Rename步骤:

; 先在Section外部定义编译期常量,方便统一修改
!define ORIGIN_EXE "Godot_v3.3.4-stable_mono_win64.exe"
!define TARGET_EXE "Godot.exe"

Section "Godot" SecGodot

  SetOutPath "$INSTDIR"
  
  ;ADD YOUR OWN FILES HERE...
  ; /oname参数直接指定释放到用户设备时的文件名
  File /oname=$TARGET_EXE "${ORIGIN_EXE}"

  SetOutPath "$INSTDIR\GodotSharp"
  File /nonfatal /a /r "GodotSharp\"
  
  ;Store installation folder
  WriteRegStr HKCU "Software\Godot" "" $INSTDIR
  
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
    
    ;Create shortcuts
    CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
    CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"

    CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Godot.lnk" "$INSTDIR\${TARGET_EXE}"
  
  !insertmacro MUI_STARTMENU_WRITE_END

SectionEnd

方案2:如果确实需要先释放再重命名,修正变量引用即可

如果你要保留Rename逻辑,调整变量定义和引用方式即可:

Section "Godot" SecGodot

  SetOutPath "$INSTDIR"
  
  ;ADD YOUR OWN FILES HERE...
  ; 这里用编译期变量定义原始文件名
  !define originalName "Godot_v3.3.4-stable_mono_win64.exe"
  StrCpy $exeName "Godot.exe"

  File "${originalName}"
  ; 运行期变量用$前缀,不要加花括号
  Rename "${originalName}" "$exeName"

  SetOutPath "$INSTDIR\GodotSharp"
  File /nonfatal /a /r "GodotSharp\"
  
  ;Store installation folder
  WriteRegStr HKCU "Software\Godot" "" $INSTDIR
  
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
    
    ;Create shortcuts
    CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
    CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"

    CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Godot.lnk" "$INSTDIR\$exeName"
  
  !insertmacro MUI_STARTMENU_WRITE_END

SectionEnd

内容的提问来源于stack exchange,提问作者NickB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:27:00