根据 Windows 版本在 Inno Setup 运行 部分执行不同的命令块
Execute different BLOCK of commands 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 个命令)并将该选项应用于整个块,而不是单独应用于每个命令。
目标不是避免"cryptic version numbers",而是避免重复相同的情况多次。并避免在块随着时间的推移而增长时忘记它的风险。
到目前为止我找到的解决方案是使用 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
文件中没有块控制功能。
为了避免重复神秘的版本号,您所能做的就是定义一个预处理器变量,例如:
#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() >= 020000 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;
我知道已经有一个问题
我的问题是如何针对不同的目标 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 个命令)并将该选项应用于整个块,而不是单独应用于每个命令。
目标不是避免"cryptic version numbers",而是避免重复相同的情况多次。并避免在块随着时间的推移而增长时忘记它的风险。
到目前为止我找到的解决方案是使用 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
文件中没有块控制功能。
为了避免重复神秘的版本号,您所能做的就是定义一个预处理器变量,例如:
#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() >= 020000 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;