Search code examples
inno-setuppascalscript

Execute different BLOCK of commands in Inno Setup Run section based on Windows version


I know there is already question Execute different command in Inno Setup Run section based on Windows version with very good answer.

My question is how to perform different blocks of commands for different target Windows versions. My problem is that I have ~10-15 commands that need to perform if target version is Windows 7 and the ~same amount of different commands for Windows 8 or above.

Is it possible to avoid the need to add ; OnlyBelowVersion: 6.2 after each command needed for first case and ; MinVersion: 6.2 after each command in the second block?

I know there is preprocessor conditions "#if", #else and #endif but that of course works only at compilation time

The question and answers Determine Windows version in Inno Setup although may look similar to this question are NOT answering it. I know how to determine Windows version in Inno Setup. I also know about those ; MinVersion: 6.2 and ; OnlyBelowVersion: 6.2 options. I am asking if it is possible to specify a block of commands (10-15 commands) and apply that option to entire block, not to each and every command individually.

The goal is not to avoid "cryptic version numbers" but to avoid repeating the same condition many times. And to avoid risk of forgetting it when block will grow over the time.

The solution that I found so far is to use CurStepChanged procedure:

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;

But it looks a bit ugly to me...


Solution

  • There are no block-control features in the .iss file.

    All you can do, to avoid repeating the cryptic version numbers, is to define a preprocessor variable like:

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

    The only other way is to reimplement the [Run] section in the [Code] using the Exec function:

    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;