如何避免在 InnoSetup 静默模式下覆盖?

How to avoid overriding in InnoSetup silent mode?

我正在尝试使用 InnoSetup 的静默模式。如果在静默模式安装中指定,我必须更新 "License" 键值。 这就是我配置 Inno 文件的方式:

[INI]
Filename: define.ini; Section: "General"; Key: "License"; String: "{param:LICENSE}"; Check: WizardSilent;

当用户以这种方式安装应用程序时效果很好:

setup.exe /SILENT /LICENSE=licensekey

当我想跳过 /LICENSE 参数时出现问题(因为它已经配置并且我不想更改它。例如:安装补丁包时)。 使用以下方式覆盖 INI 文件上的 "License" 键并将其留空:

setup.exe /SILENT

如何避免这种情况?在这种情况下,我只想不更改 "License" 值。

谢谢!

我可以想到两个选项,因为您使用的是自定义参数。您可以将 {param} 常量的默认值定义为从同一 INI 文件读取的现有值:

[INI]
...; String: "{param:LICENSE|{ini:define.ini,General,License|}}"

以上语句写入由 LICENSE 命令行参数传递的给定 INI 文件值,或者如果未指定则从同一文件读取相同值。因此,如果未指定参数,它实际上会用相同的值覆盖该值,这在我看来不太干净。

或者,您可以通过辅助函数扩展现有的 Check 参数,如下所示。这是我更喜欢的方式,因为您只是跳过条目的处理而不是在未指定参数时覆盖相同的值:

[INI]
...; Check: WizardSilent and CmdLineParamExists('/LICENSE')

[Code]
function CmdLineParamExists(const Value: string): Boolean;
var
  I: Integer;  
begin
  Result := False;
  for I := 1 to ParamCount do
    if CompareText(ParamStr(I), Value) = 0 then
    begin
      Result := True;
      Exit;
    end;
end;