在基于Windows版本

时间:2016-07-10 09:27:29

标签: inno-setup

我知道问题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个命令)并将该选项应用于整个块,而不是单独应用于每个命令。

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

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

但对我来说看起来有点难看......

1 个答案:

答案 0 :(得分: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重新实现[Run]中的[Code]部分:

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;