【发布时间】:2010-03-25 08:33:28
【问题描述】:
我正在使用 InnoSetup 创建我的应用程序安装程序,并且我设置了“SetupLogging=yes”标志以始终在 %TEMP% 目录中创建一个安装日志文件。这适用于安装过程。不幸的是,当我卸载应用程序时,InnoSetup 不会创建这样的日志文件。
是否有强制 InnoSetup 创建卸载日志文件的标志/可能性?
【问题讨论】:
我正在使用 InnoSetup 创建我的应用程序安装程序,并且我设置了“SetupLogging=yes”标志以始终在 %TEMP% 目录中创建一个安装日志文件。这适用于安装过程。不幸的是,当我卸载应用程序时,InnoSetup 不会创建这样的日志文件。
是否有强制 InnoSetup 创建卸载日志文件的标志/可能性?
【问题讨论】:
我已经能够让安装程序写入日志文件,方法是在图标部分将“/log”选项作为参数添加到其 exe:
[Setup]
...
SetupLogging=yes
...
[Icons]
...
Name: {group}\Uninstall; Filename: {uninstallexe}; Parameters: "/log";
【讨论】:
我编写了以下代码来实现@mlaan 的答案(将“/log”附加到注册表中的卸载字符串)。请注意,我只检查 HKLM。您可以添加行来检查 HKCU。
#define MyAppID "{3D97CC33-75B0-4D86-8533-B213E5FF4046}"
[Setup]
AppId={{#MyAppID}
[Code]
procedure AppendStringToRegValue(const RootKey: integer; const SubKeyName, ValueName, StringToAppend: string);
var
OldValue: string;
NewValue: string;
RootKeyString: string;
begin
case RootKey of
HKLM:
RootKeyString := 'HKLM';
HKCU:
RootKeyString := 'HKCU';
else
RootKeyString := 'RootKey ' + IntToStr(RootKey);
end;
if RegQueryStringValue( RootKey, SubKeyName, ValueName, OldValue ) then
begin
NewValue := OldValue + StringToAppend
if RegWriteStringValue( RootKey, SubKeyName, ValueName, NewValue ) then
Log('Updated ' + RootKeyString + '\' + SubKeyName + '\' + ValueName + '. New Value = [' + NewValue + '].')
else
Log('Could not write to ' + RootKeyString + '\' + SubKeyName + '\' + ValueName + '. Value remains [' + OldValue + '].' )
end
else
Log('Could not read from ' + RootKeyString + '\' + SubKeyName + '\' + ValueName + '.' );
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
OldValue: string;
NewValue: string;
UninstallSubKeyName: string;
begin
if CurStep = ssPostInstall then
begin
{ Modify uninstall registry entries to add "/log" parameter for uninstall }
UninstallSubKeyName := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppID}_is1'
AppendStringToRegValue(HKLM, UninstallSubKeyName, 'UninstallString', ' /log')
AppendStringToRegValue(HKLM, UninstallSubKeyName, 'QuietUninstallString', ' /log')
end;
end;
【讨论】:
我不是专家,但就我而言,我注意到在安装过程中,在安装目录中还创建了一个具有以下名称的文件:
unins000.exe
所以,要创建卸载日志文件,我只需要从命令行调用该文件,给出日志的路径\名称,在我的例子中是 disinstallazione.log:
unins000.exe /log="C:\disinstallazione.log"
这就是我如何理解卸载过程中发生的事情。
附:在我的情况下,我也有
SetupLogging=yes
【讨论】:
不,您必须使用 [代码] 更新 Uninstall 注册表项以在 UninstallString 值中包含 /LOG 参数。
注册表项将为 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall(YourAppID)_is1 或 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall(YourAppID)_is1
在安装结束时执行此操作,并且仅在安装成功时执行。例如在 CurStep = ssPostInstall 的 CurStepChanged 事件函数中。
【讨论】:
将这两行放在 InnoSetup 脚本的 [Setup] 部分中
[Setup]
SetupLogging=yes
UninstallLogMode=append
卸载后,在临时文件夹中查找您的日志。在 Windows7 中,该位置将是
C:\Users\<UserName>\AppData\Local\Temp
你会发现一个类似的文件
Setup Log 2014-12-10 #001.txt
那是你的 Inno 设置日志文件。
【讨论】:
UninstallLogMode 指令与卸载过程中发生的操作的日志无关,但它与 unins*.dat 卸载日志文件(这是保存有关如何卸载应用程序的说明的文件)有关。除此之外,append 值是默认值,因此不需要明确指定。所以你发现的是(很可能)一个安装日志文件,而问题要求卸载日志。