【问题标题】:How to force InnoSetup to create an uninstall log file如何强制 InnoSetup 创建卸载日志文件
【发布时间】:2010-03-25 08:33:28
【问题描述】:

我正在使用 InnoSetup 创建我的应用程序安装程序,并且我设置了“SetupLogging=yes”标志以始终在 %TEMP% 目录中创建一个安装日志文件。这适用于安装过程。不幸的是,当我卸载应用程序时,InnoSetup 不会创建这样的日志文件。

是否有强制 InnoSetup 创建卸载日志文件的标志/可能性?

【问题讨论】:

    标签: installation inno-setup


    【解决方案1】:

    我已经能够让安装程序写入日志文件,方法是在图标部分将“/log”选项作为参数添加到其 exe:

    [Setup]
    ...
    SetupLogging=yes
    ...
    
    [Icons]
    ...
    Name: {group}\Uninstall; Filename: {uninstallexe}; Parameters: "/log";
    

    【讨论】:

    • 这可行,但需要用户从“开始”菜单图标而不是“卸载程序”列表中卸载。
    【解决方案2】:

    我编写了以下代码来实现@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;
    

    【讨论】:

      【解决方案3】:

      我不是专家,但就我而言,我注意到在安装过程中,在安装目录中还创建了一个具有以下名称的文件:

       unins000.exe
      

      所以,要创建卸载日志文件,我只需要从命令行调用该文件,给出日志的路径\名称,在我的例子中是 disinstallazione.log:

      unins000.exe  /log="C:\disinstallazione.log"
      

      这就是我如何理解卸载过程中发生的事情。


      附:在我的情况下,我也有

      SetupLogging=yes
      

      【讨论】:

      • 这对我有用,使用 Inno Setup 编译器 5.5.7。谢谢!
      【解决方案4】:

      不,您必须使用 [代码] 更新 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 事件函数中。

      【讨论】:

      • 感谢您的回答。这个解决方案对我来说很好。但是(...)它确实有一种肮脏的黑客的感觉。知道将来是否会将此功能添加为设置标志?
      • 感谢您的建议。您可能还想更新 QuietUninstallString 值。我在单独的答案中提供了示例代码。
      【解决方案5】:

      将这两行放在 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 值是默认值,因此不需要明确指定。所以你发现的是(很可能)一个安装日志文件,而问题要求卸载日志。
      猜你喜欢
      • 1970-01-01
      • 2012-11-16
      • 2017-09-25
      • 2014-04-10
      • 2021-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多