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

Inno Setup重命名安装目录后如何让[Run]段读取新路径启动程序

解决方案

Inno Setup的内置常量{app}是安装程序初始化阶段就确定的固定值,你后续手动重命名安装目录不会自动更新该常量的值,所以原生[Run]段直接用{app}肯定找不到重命名后的路径。

第一步:调整代码逻辑结构

你之前把重命名逻辑放在InitializeWizard里不合理,这个阶段是向导刚启动、还没执行文件复制操作,提前改目录会导致后续补丁文件写入到错误路径。建议把重命名逻辑移动到所有文件复制完成后的CurStepChanged事件中执行,同时新增全局变量存储新路径、新增供[Run]段调用的路径获取函数。

第二步:完整修改后的配置

[Setup]
UsePreviousAppDir=yes
; 重命名Program Files目录需要管理员权限,建议加上这行配置
PrivilegesRequired=admin

[Run]
Filename: "{code:GetNewAppExePath}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

[Code]
// 全局变量存储重命名后的完整安装目录路径
var
  NewAppDir: string;

// 供[Run]段调用的动态获取exe路径函数
function GetNewAppExePath(Param: string): string;
begin
  Result := NewAppDir + '\{#MyAppExeName}';
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  OldAppDir: string;
begin
  // 所有文件复制完成后、进入收尾阶段时执行重命名
  if CurStep = ssPostInstall then
  begin
    OldAppDir := ExpandConstant('{app}');
    // 拼接新目录路径,按照你的原有规则编写,可自行核对路径拼接逻辑是否符合预期
    NewAppDir := ExtractFileDir(OldAppDir) + '\{#MyAppName} {#MyAppVersion}';
    // 执行重命名,增加成功判断避免后续报错
    if RenameFile(OldAppDir, NewAppDir) then
    begin
      // 重命名成功后可补充其他自定义逻辑
    end;
  end;
end;

额外注意事项

  • 重命名前建议加逻辑判断原目录下的程序是否正在运行,运行中的程序会锁定目录导致重命名失败
  • 请自行核对新路径的拼接逻辑,避免出现目录层级错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:48:03