在Inno Setup脚本的[UninstallRun]部分中有关使用RunOnceId的说明

问题描述

这是我的[Uninstallrun]部分:

[Uninstallrun]
Filename: {dotnet40}\regasm.exe; Parameters: /u MSAToolsLibrary_x86.dll; WorkingDir: {app}; Flags: runhidden;
Filename: {dotnet4064}\regasm.exe; Parameters: /u MSAToolsLibrary_x64.dll; WorkingDir: {app}; Flags: runhidden; Check: IsWin64;
Filename: {dotnet40}\regasm.exe; Parameters: /u MSAToolsGMailLibrary_86.dll; WorkingDir: {app}\MSAToolsGMailLibrary; Flags: runhidden
Filename: {dotnet4064}\regasm.exe; Parameters: /u MSAToolsGMailLibrary_64.dll; WorkingDir: {app}\MSAToolsGMailLibrary; Flags: runhidden; Check: IsWin64;

当我使用Inno Setup 6.1.1进行编译时,收到以下警告:

警告:有[Uninstallrun]个部分条目,没有RunOnceId参数。通过为RunOnceId分配字符串,可以确保特定的[Uninstallrun]条目在卸载期间仅执行一次。有关更多信息,请参见帮助文件中的“ [Uninstallrun]主题

我在RunOnceId的帮助中指出:

仅在[Uninstallrun]节中有效。如果同一应用程序安装了多次,则“运行”条目将在卸载日志文件中重复。通过为RunOnceId分配字符串,可以确保特定的[Uninstallrun]条目在卸载期间仅执行一次。例如,如果卸载日志中的两个或更多“运行”条目的RunOnceId设置为“ DelService”,则仅执行最新的RunOnceId设置为“ DelService”的条目;否则,将执行最新的条目。其余的将被忽略。请注意,RunOnceId比较是区分大小写的。如果您没有为RunOnceId分配字符串,编译器会警告您,可以使用MissingRunOnceIdsWarning禁用它。

我可以关闭警告。但是我想知道我是否真的需要在设置中使用此参数,因为到目前为止我还没有使用过此参数。

解决方法

您应该使用该参数,如警告所示。

如果不这样做,则每次升级(除非安装程序卸载了先前版本)都将对[UninstallRun]命令的新执行进行排队。因此,如果您先安装9次然后升级,那么在卸载时,所有卸载命令将执行10次。当然,就您而言,这仅意味着您的每个regasm /u命令都会失败9次。没什么大不了的,但是如果用户检查卸载程序日志(以防万一他们有问题),他们将看到很多故障,这可能会误导他们。

请注意,您无法追溯解决此问题。以前的安装程序排队的卸载命令仍将对每个过去的安装执行。但是,如果这是一个主要问题,您可能已经注意到了。