WIX:定义在my.wxs文件中不工作

WIX:定义在my.wxs文件中不工作,wix,windows-installer,Wix,Windows Installer,我正在尝试定义基于操作系统的升级代码 <?if VersionNT=601?> <?define MyUpgradeCode="{GUIDFOR_WIN7}"?> <?elseif VersionNT&gt;=602?> <?define MyUpgradeCode="{GUIDFOR_WIN8AND_LATER}"?> <?endif?> .... .... .... <Product Name="My Prod

我正在尝试定义基于操作系统的升级代码

<?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"
            >

如何根据要安装的Windows OS版本配置2升级代码?

如果是64位计算机,则需要使用而不是属性

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

或者,您可以根据前面提到的操作系统阻止整个安装

更新


用上面的代码替换WXS,它就可以工作了。首先定义变量,然后在IF/ElseIF代码中设置它的值

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

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


在这里阅读更多关于它的信息

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

好的,您可以在此处添加安装日志吗?日志语法msiexec/I mymsi.msi/l*v File.txtI正在测试这个问题,我知道发生了什么。它甚至不会编译,因为在该点上没有对变量求值。就像我说的,你能详细解释一下为什么你需要一个单独的GUID吗?一个MSI有多个升级代码不是一个好主意。我认为您应该使用条件元素并限制进入Win7和win8的内容,而不是更改产品代码。请让我知道你正在努力实现什么,我可能会提供帮助!谢谢,它的编译失败了,所以我不能共享日志。我的问题是为什么这不能做到?我已经检查了一些其他wix项目,它已经通过.wxi文件使用,定义在.wxi中,所以为什么我们不能使用它.wxs文件?更新了答案-请检查。我们需要知道这是为了什么-为什么你需要两个升级代码?听起来这不是一个好的设计。预处理器变量不是运行时变量-它们只是在将源文件发送到编译器之前更改源文件-在安装MSI时找不到它们-然后处理运行时变量(而不是预处理器变量所在的编译时变量)。
 error CNDL0150: Undefined preprocessor variable '$(var.MyUpgradeCode)'. [C:\
Users\abc\Installer.wixproj]
    <?define MyUpgradeCode ?>

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