更改 Inno Setup 卸载程序的默认名称以避免命名冲突

Posted

技术标签:

【中文标题】更改 Inno Setup 卸载程序的默认名称以避免命名冲突【英文标题】:Change the default name of an Inno Setup uninstaller to avoid naming conflicts 【发布时间】:2013-09-08 15:37:06 【问题描述】:

我需要在同一目录中安装几个安装程序,因此它与 Inno Setup 卸载程序名称 unins000.exeunins000.dat 冲突

有没有办法更改 Inno Setup 卸载程序的默认名称?

【问题讨论】:

不可能。你应该避免使用下面答案中的技巧。重命名卸载程序文件将中断升级。见jrsoftware.org/ishelp/index.php?topic=appendnotes 【参考方案1】:

没有。 'unins' 在可执行文件、数据和 msg 文件的名称生成过程中被硬编码,在 inno-setup 源的 'install.pas' 中的 GenerateUninstallInfoFilename' 过程中。

GenerateFilenames子程序有这个:

BaseFilename := AddBackslash(BaseDir) + Format('unins%.3d', [I]);
UninstallExeFilename := BaseFilename + '.exe';
..

其中“I”是一个整数,“BaseDir”派生自 UninstallFilesDir,您可以对其进行更改。

【讨论】:

【参考方案2】:

我自己处理了这个。由于 Martin Prikryl 指出的原因,您不应该移动卸载程序可执行文件本身。但我同意让一堆编号的卸载程序坐在一个目录中而没有明显的方法来分辨哪个是哪个是不令人满意的。

有一个使用 Inno Setup 提供的工具的解决方案。在[Setup] 部分:

[Setup]
...
UninstallFilesDir=Uninstall\exe\#NAME_OF_APP
...

然后在[Dirs] 部分:

[Dirs]
...
Name: Uninstall\exe; Attribs: hidden;
Name: Uninstall\exe\#NAME_OF_APP; Attribs: hidden;
...

最后,您在 [Icons] 中创建命名快捷方式,指向卸载程序,因为您已将它们隔离,所以它们将始终具有相同的名称:

[Icons]
...
Name: Uninstall\#NAME_OF_UNINSTALLER; Filename: Uninstall\exe\#NAME_OF_APP\unins000.exe
...

这将操作系统中的引用仅保留给卸载程序,将令人困惑的可执行文件名称隐藏在用户通常不会看到但仍可以访问的文件夹中,并提供可以全部存在于同一文件夹中的命名、描述性快捷方式。您还可以给快捷方式一个好的图标。为了更好地衡量,也许在 \exe 目录中添加一个额外的 README 来解释发生了什么,以防万一有人多管闲事(他们自然会)。

【讨论】:

分配UninstallFilesDir=app\<Your Installer Name> 对我来说已经足够了 将卸载文件移动到隐藏目录并在主应用程序目录中创建它们的快捷方式是有意义的,谢谢。我最终做了#define MyAppName "Awesome Program" | #define MyUninstallerName "Uninstall" | [Setup] UninstallFilesDir=app\Uninstall | [Dirs] Name: "app\Uninstall"; Attribs: hidden | [Icons] Name: "app\#MyUninstallerName"; Filename: "app\Uninstall\unins000.exe"【参考方案3】:

当 Inno 检测到不同的应用程序安装到同一目录中时(基于不同的AppID),它会自动执行此操作。应该没有必要背着它重命名卸载程序文件。

【讨论】:

这是错误的,因为很难分辨哪个卸载程序属于哪个安装。 @Magnus 随机浏览文件夹的人无法区分它们的事实并不意味着 Inno 会自动处理此错误。如果您,作为开发人员想让它更容易,在开始菜单组中添加指向uninstallexe 的快捷方式,将它们指向添加/删除程序小程序,或设置UninstallDir。 Inno 仍然按照设计完美地处理同一文件夹中的不同应用程序。【参考方案4】:

好吧,虽然仍然不可能在本地更改卸载程序名称,但我将在运行部分使用批处理命令重命名卸载程序并在卸载程序注册表路径中执行相同操作:

[Run]
Filename: cmd; Parameters: "/C Move ""app\unins000.exe"" ""app\Uninstallers\#ApplicationName - uninstall.exe"""; StatusMsg: Installing #ApplicationName...; Flags: RunHidden WaitUntilTerminated
Filename: cmd; Parameters: "/C Move ""app\unins000.dat"" ""app\Uninstallers\#ApplicationName - uninstall.dat"""; StatusMsg: Installing #ApplicationName...; Flags: RunHidden WaitUntilTerminated

Filename: REG.exe; Parameters: "ADD ""HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Windows 8 ContextMenu - #ApplicationName_is1"" /V ""UninstallString"" /T ""REG_SZ"" /D ""\""app\Uninstallers\#ApplicationName - uninstall.exe\"""" /F"; StatusMsg: Installing #ApplicationName...; Flags: RunHidden WaitUntilTerminated
Filename: REG.exe; Parameters: "ADD ""HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Windows 8 ContextMenu - #ApplicationName_is1"" /V ""QuietUninstallString"" /T ""REG_SZ"" /D ""\""app\Uninstallers\#ApplicationName - uninstall.exe\"" /SILENT"" /F"; StatusMsg: Installing #TipName...; Flags: RunHidden WaitUntilTerminated

【讨论】:

赞成一个,因为我能够调整这个解决方案来为我工作(见下面发布的解决方案)【参考方案5】:

这类似于 Elektrostudios 的回答,对我有用:

    Filename: cmd; Parameters: "/C Mkdir ""app\Uninstallers\#MyAppName"""; Flags: RunHidden WaitUntilTerminated
    Filename: cmd; Parameters: "/C Move ""app\unins000.exe"" ""app\Uninstallers\#MyAppName - uninstall.exe"""; StatusMsg: Installing #MyAppName...; Flags: RunHidden WaitUntilTerminated
    Filename: cmd; Parameters: "/C Move ""app\unins000.dat"" ""app\Uninstallers\#MyAppName - uninstall.dat"""; StatusMsg: Installing #MyAppName...; Flags: RunHidden WaitUntilTerminated
    Filename: cmd; Parameters: "/C Move ""app\unins000.msg"" ""app\Uninstallers\#MyAppName - uninstall.msg"""; StatusMsg: Installing #MyAppName...; Flags: RunHidden WaitUntilTerminated
    Filename: REG.exe; Parameters: "ADD ""HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Windows 8 ContextMenu - #MyAppName_is1"" /V ""UninstallString"" /T ""REG_SZ"" /D ""\""app\Uninstallers\#MyAppName - uninstall.exe\"""" /F"; StatusMsg: Installing #MyAppName...; Flags: RunHidden WaitUntilTerminated
    Filename: REG.exe; Parameters: "ADD ""HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Windows 8 ContextMenu - #MyAppName_is1"" /V ""QuietUninstallString"" /T ""REG_SZ"" /D ""\""app\Uninstallers\#MyAppName - uninstall.exe\"" /SILENT"" /F"; StatusMsg: Installing #MyAppName...; Flags: RunHidden WaitUntilTerminated

在使用 Windows 7 时,我发现“移动”命令不起作用,除非我可以先将文件移动到某个位置,这意味着我必须在顶部添加 mkdir 行。此外,如果不移动 .msg 文件,卸载程序将无法工作,因此我也按照模式添加了该行。

我没有费心将“Windows 8”更改为“Windows 7”,但没有任何区别,所以我不理会它。如果有我不知道的问题,我相信有人会在评论中指出。

#MyAppName 当然是定义在 ISS 文件顶部的常量,用于声明应用程序的名称。您的常量的定义可能不同,因此您需要在必要时对其进行更改以匹配。

【讨论】:

只是我更喜欢给帮助给我和回答的人打分,谢谢分享! 是的,@SertacAkyuz 你是对的,它不是“更改默认卸载程序名称”,但是,它是一种解决方法,无法这样做。因此,虽然它不能直接回答手头的问题,但它确实解决了问题。 无法保证卸载程序被命名为unins000.exe。如果已经有另一个具有此名称的文件,则该数字会有所不同。例如,如果您正在降级您的应用程序,可能会发生什么。另见jrsoftware.org/ishelp/index.php?topic=appendnotes【参考方案6】:

Inno Setup 不提供任何方法让您命名(或重命名)卸载程序。 Inno Setup 会自行处理命名冲突。

另请注意,当您尝试手动重命名卸载程序时(就像这里的一些答案一样),您会在控制面板的添加或远程应用程序中破坏对卸载程序的引用。

即使你修复了引用,还有另一个问题。当您稍后升级时,新安装程序将找不到以前安装程序的日志,并且无法合并它们。因此,未来的卸载不会完全删除该应用程序。请参阅 Inno 设置文档中的 Appending to Existing Uninstall Logs。

【讨论】:

以上是关于更改 Inno Setup 卸载程序的默认名称以避免命名冲突的主要内容,如果未能解决你的问题,请参考以下文章

Inno Setup5 如何更改卸载图标(我做出来的安装程序和卸载的一样)我想把卸载图标换成别的。

Inno Setup卸载可执行文件的位置和名称

使用 inno setup 卸载默认图标

跪求inno setup补丁包更新后,卸载程序不能删除注册表?

关于Inno Setup卸载程序删除文件夹的问题

Inno Setup 默认安装文件夹更改