在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
相关产品推荐
相关产品推荐

