【问题标题】:How to rename program group in an Inno Setup update installation?如何在 Inno Setup 更新安装中重命名程序组?
【发布时间】:2022-11-09 15:40:39
【问题描述】:

我们基于 Inno Setup 的安装程序会创建一个程序组,并在其名称中包含主要版本号,例如"富吧 2“。这最初是由指令完成的

[Setup]
; Note: there is no AppId 
...
DefaultGroupName={#AppName} {#AppVersion}
UsePreviousGroup=yes

Inno Setup 会记住此名称并重复使用它。所以对于我们即将发布的新版本,主要数字现在是3但节目组没有更新为“富吧3“并保持在”美食吧 2”。

我尝试通过[InstallDelete] 删除{group} 失败。删除组文件夹或重命名它也不适合我。

根据比尔的提示,我想知道如何在更新安装期间去除程序组的版本号。

如果用户更改了组的名称并且它不再匹配默认名称,我不会更改它。

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

    您必须在 Pascal 脚本中编写代码。像这样的东西:

    #define AppName "My Program"
    
    [Setup]
    DefaultGroupName={#AppName}
    
    [Code]
    var
      GroupPath: string;
    
    procedure InitializeWizard();
    var
      GroupName: string;
    begin
      if not WizardForm.NoIconsCheck.Checked then
      begin
        GroupName := RemoveBackslashUnlessRoot(WizardForm.GroupEdit.Text);
        if GroupName = '{#AppName} 2' then
        begin
          GroupPath := AddBackslash(ExpandConstant('{autoprograms}')) + GroupName;
          WizardForm.GroupEdit.Text := '{#SetupSetting("DefaultGroupName")}';
          Log(Format('Old version Start menu group "%s" (path "%s") was found, ' + 
                     'it will be deleted and new icons will be created in "%s"', [
                     GroupName, GroupPath, WizardForm.GroupEdit.Text]));
        end;
      end;
    end;
    
    procedure CurStepChanged(CurStep: TSetupStep);
    begin
      if CurStep = ssInstall then
      begin
        if GroupPath <> '' then
        begin
          Log(Format('Deleting old Start menu group from folder "%s"', [GroupPath]));
          if DelTree(GroupPath, True, True, True) then Log('Successfully deleted')
            else Log('Error while deleting');
        end;
      end;
    end;
    

    小心使用。如果路径计算不正确,调用DelTree(特别是具有管理员权限)可能会导致灾难。您可能会考虑只删除特定的单个图标文件,然后再删除空 (if) 文件夹。


    尽管请注意,开始菜单组不应按照 Windows 指南使用,因为就像 Windows 7 一样。所以正确的解决方案是删除该组而不是重命名它。

    【讨论】:

    • 对此有何反馈?
    • 删除旧的程序组文件夹有效,但在更新安装期间会重新创建。 Inno Setup 似乎记得旧的组名。这就是为什么它最初看起来好像该文件夹没有被删除。我发现,将 UsePreviousGroup 设置为 No 将使 Inno Setup 使用新的默认组名。我也跳过了更新安装的wpSelectProgramGroup 页面,并且只删除该文件夹,如果它仍然以基本默认应用程序名称开头。