inno-setup - 根据 Windows 版本在 Inno Setup Run 部分执行不同的命令 block

标签 inno-setup pascalscript

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

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

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

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

问答Determine Windows version in Inno Setup尽管可能看起来与此问题类似但未回答。我知道如何在 Inno Setup 中确定 Windows 版本。我也知道那些 ;最低版本:6.2; OnlyBelowVersion: 6.2 选项。我想问是否可以指定一个命令 block (10-15 个命令)并将该选项应用于整个 block ,而不是单独应用于每个命令。

目标不是避免“神秘的版本号”,而是避免多次重复相同的条件。并避免在 block 随时间增长时忘记它的风险。

到目前为止,我找到的解决方案是使用 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;

但我觉得有点丑...

最佳答案

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

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

#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;

关于inno-setup - 根据 Windows 版本在 Inno Setup Run 部分执行不同的命令 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38290445/

相关文章:

inno-setup - 如何从代码部分完全禁用 Inno Setup 中的特定组件?

window - Inno安装程序更改c :\permission

java - 在 Inno Setup 中检测 Java 版本

regex - Inno Setup 中字符串的正则表达式

inno-setup - 安装开始前 Inno Setup : Download setup . bin 切片文件

installation - 如何从 PascalScript 代码更新 InnoSetup Wizard GUI 状态文本

inno-setup - 如何将 Inno Setup 任务页面的任务列表拆分为多个列?

visual-c++ - Inno Setup 如何检查系统上是否存在 MSVCR100.dll

inno-setup - Inno 安装程序 : Custom classes

inno-setup - 从代码更改组件复选框状态后,Inno Setup 更新磁盘空间