如何在WIX中获取命令/脚本执行结果并检测Win10及以上系统
在WIX中捕获脚本输出并赋值给属性(检测Win10及以上系统)
问题根源
你当前使用的WixShellExec是用于启动外部程序的自定义动作类型,它无法捕获脚本的输出内容并赋值给WIX属性,只能返回执行成功/失败状态,这就是你无法获取版本值的原因。
解决方案
方法1:直接使用WIX内置属性判断(推荐)
Windows Installer本身提供了内置属性VersionNT,可直接用来判断系统版本:
- Win10及Win11的
VersionNT值为1000及以上 - Win7对应
601,Win8对应602,Win8.1对应603
如果只是需要判断是否为Win10及以上系统,无需额外脚本,直接在条件中使用:
<!-- 示例:仅在Win10及以上系统执行某个动作 --> <CustomAction Id="YourTargetAction" ... /> <InstallExecuteSequence> <Custom Action="YourTargetAction" After="InstallInitialize">VersionNT >= 1000</Custom> </InstallExecuteSequence>
方法2:用VBScript自定义动作获取版本并赋值属性
如果需要将系统版本号赋值给自定义属性,可使用内嵌VBScript编写自定义动作:
<CustomAction Id="GetWindowsMajorVersion" Script="vbscript" Execute="immediate"> <![CDATA[ Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set colOS = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") For Each objOS in colOS ' 提取系统主版本号,Win10及以上主版本为10 Session.Property("WindowsMajorVersion") = Split(objOS.Version, ".")(0) Next ]]> </CustomAction> <!-- 在UI序列中调用该动作 --> <InstallUISequence> <Custom Action="GetWindowsMajorVersion" After="AppSearch" /> </InstallUISequence>
之后即可在WIX中通过[WindowsMajorVersion]引用该属性,判断值是否大于等于10。
方法3:使用批处理脚本配合正确的自定义动作类型
若坚持使用bat脚本,需将自定义动作改为支持捕获输出的类型,步骤如下:
- 修改
test.bat脚本,将版本号输出到标准输出:
@echo off :: 从注册表读取系统主版本号 for /f "tokens=3" %%g in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentMajorVersionNumber') do ( echo %%g )
- 在WIX中定义自定义动作时,使用
Type="18"(表示捕获脚本输出到属性),替换原来的WixShellExec:
<Binary Id="OSMajorVersionScript" SourceFile="test.bat" /> <CustomAction Id="GetWindowsMajorVersion" Execute="immediate" Property="WindowsMajorVersion" Return="check" Impersonate="yes" BinaryKey="OSMajorVersionScript" Type="18"/> <!-- 在UI序列中调用 --> <InstallUISequence> <Custom Action="GetWindowsMajorVersion" After="AppSearch" /> </InstallUISequence>
这种方式会将bat脚本的标准输出内容直接赋值给WindowsMajorVersion属性。
内容的提问来源于stack exchange,提问作者junhong fan
相关产品推荐
相关产品推荐

