WIX:在我的 .wxs 文件中定义不起作用



我正在尝试根据操作系统定义myUpgrade代码

<?if VersionNT=601?>
<?define MyUpgradeCode="{GUIDFOR_WIN7}"?>
<?elseif VersionNT&gt;=602?>
<?define MyUpgradeCode="{GUIDFOR_WIN8AND_LATER}"?>
<?endif?>
....
....
....
<Product Name="My Product"
Id="*"
UpgradeCode="$(var.MyUpgradeCode)"
Version=""
Language="1033"
>

但它未能评估。

error CNDL0150: Undefined preprocessor variable '$(var.MyUpgradeCode)'. [C:
UsersabcInstaller.wixproj]

如何根据要安装的 Windows 操作系统版本配置 2 个升级代码

如果它是一台 64 位机器,那么你需要使用 VERSIONNT64 而不是 VERSIONNT 属性。

请问您为什么要根据操作系统更改升级代码?如果您只是想避免维护 WXS 文件的 2 个不同版本,为什么不直接进行条件安装呢?如果有特定的组件/功能转到 Win7 和 Win8,为什么不使用条件元素将组件/功能标记为有条件?

或者您可以根据操作系统阻止整个安装,如此处所述

更新

<?define MyUpgradeCode ?>
<?if VersionNT=601?>
<?define MyUpgradeCode="{BF23D7DA-FE7D-446A-8950-3B92DD40FED3}"?>
<?elseif VersionNT&gt;=602?>
<?define MyUpgradeCode="{3CA8F7F3-312B-4778-97CE-EE9B2C5453E6}"?>
<?endif?>

将您的 WXS 替换为上面的代码,它将起作用。首先定义变量,然后在 IF/ElseIF 代码中设置其值。

现在要指出的一件重要事情是,WIX 中的 IF/Else 和所有其他条件语句都是在构建时计算的。因此,它将根据正在编译的计算机/服务器的操作系统版本而不是部署位置来设置升级属性。

条件语句的目的是允许您在生成时包含或排除 xml 段。如果表达式的计算结果为 true,则将包含该表达式。如果它的计算结果为 false,它将被忽略。

在此处阅读更多相关信息。WIX预处理器

看起来您正在项目节点之外定义您的变量。当我使用 WiX 设置编辑器时,我遇到了同样的错误,它创建了各种变量,就像在您的示例中一样。将定义移动到项目节点内部,然后上面的答案是正确的。

最新更新