【问题标题】:Execute different BLOCK of commands in Inno Setup Run section based on Windows version根据 Windows 版本在 Inno Setup Run 部分执行不同的命令块
【发布时间】:2016-11-12 10:14:37
【问题描述】:

我知道已经有问题Execute different command in Inno Setup Run section based on Windows version 有很好的答案。

我的问题是如何为不同的目标 Windows 版本执行不同的命令块。我的问题是,如果目标版本是 Windows 7,我有 ~10-15 个命令需要执行,而对于 Windows 8 或更高版本,我需要执行 ~ 相同数量的不同命令。

是否可以避免在第一种情况所需的每个命令后添加; OnlyBelowVersion: 6.2,在第二个块中的每个命令后添加; MinVersion: 6.2

我知道有预处理器条件 "#if"#else#endif 但当然只在编译时有效

问题和答案Determine Windows version in Inno Setup 虽然可能看起来类似于这个问题,但没有回答它。我知道如何在 Inno Setup 中确定 Windows 版本。我也知道; MinVersion: 6.2; OnlyBelowVersion: 6.2 选项。我在问是否可以指定一个命令块(10-15 个命令)并将该选项应用于整个块,而不是单独应用于每个命令。

我们的目标不是避免“神秘的版本号”,而是避免多次重复相同的条件。并且避免在块随着时间的推移而忘记它的风险。

目前我找到的解决方案是使用CurStepChanged 过程:

procedure CurStepChanged(CurStep: TSetupStep);
begin
   if CurStep = ssPostInstall then
      if IsWindows8OrLater() then
         MsgBox('Running on Windows 8 Or Later', mbInformation, MB_OK)
         { 15 comands or call of W8-specific procedure goes here }
      else begin
         MsgBox('Running on Windows 7', mbInformation, MB_OK);
         { 15 comands or call of W7-specific procedure goes here }
      end;
end;

但是我觉得有点难看……

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

    .iss 文件中没有块控制功能。

    为了避免重复神秘的版本号,您所能做的就是定义一个预处理器变量,例如:

    #define Windows8AndNewer "MinVersion: 6.2"
    #define Windows7AndOlder "OnlyBelowVersion: 6.2"
    
    [Run]
    Filename: "Windows8-Command1.exe"; {#Windows8AndNewer}
    Filename: "Windows8-Command2.exe"; {#Windows8AndNewer}
    
    Filename: "Windows7-Command1.exe"; {#Windows7AndOlder}
    Filename: "Windows7-Command2.exe"; {#Windows7AndOlder}
    

    唯一的其他方法是使用Exec function 重新实现[Code] 中的[Run] 部分:

    procedure Run(FileName: string);
    var
      ResultCode: Integer;
    begin
      Exec(FileName, '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
      { some error checking }
    end;
    
    procedure CurStepChanged(CurStep: TSetupStep);
    begin
      if CurStep = ssPostInstall then
      begin
        if GetWindowsVersion() >= $06020000 then
        begin
          Log('Running on Windows 8 or later');
          Run('Windows8-Command1.exe');
          Run('Windows8-Command2.exe');
        end
          else
        begin
          Log('Running on Windows 7 or older');
          Run('Windows7-Command1.exe');
          Run('Windows7-Command2.exe');
        end;
      end;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      相关资源
      最近更新 更多