Wix r或在主要升级启动的卸载中-无论您多么努力地思考问题,测试始终是证明

Wix r或在主要升级启动的卸载中-无论您多么努力地思考问题,测试始终是证明,wix,windows-installer,installation,windows-server-2012-r2,windows-server-2016,Wix,Windows Installer,Installation,Windows Server 2012 R2,Windows Server 2016,使用VBScript在运行时评估您的条件: MsgBox“条件:”&CBool(Session.EvaluateCondition(“已安装或(VersionNT>=603)”) 这样的VBScript自定义操作可以按照您的意愿以不同的顺序和不同的位置插入。属性值可能会因您的排序(!)以及您所处的安装模式(安装,卸载,修复,修改,自修复,主要升级(包括一个MSI安装和一个MSI卸载),次要升级,次要升级补丁,主要升级补丁等),以及您是否在延迟或立即上下文中运行,或者是否在静默或交互中运行,不管

使用VBScript在运行时评估您的条件:

MsgBox“条件:”&CBool(Session.EvaluateCondition(“已安装或(VersionNT>=603)”)
这样的VBScript自定义操作可以按照您的意愿以不同的顺序和不同的位置插入。属性值可能会因您的排序(!)以及您所处的安装模式(
安装
卸载
修复
修改
自修复
主要升级
(包括一个MSI安装和一个MSI卸载),
次要升级
次要升级补丁
主要升级补丁
等),以及您是否在
延迟
立即
上下文中运行,或者是否在静默交互中运行,不管我忘记了什么变量——MSI中有很多运动部件。例如,如果在UI序列的开头插入自定义操作,则AppSearch尚未运行,某些属性尚未设置。如果需要,还可以在
管理-
广告安装序列中插入属性调试构造

为了测试的目的,可能还有一些其他条件:

  • “未安装且未检测到WIX升级”
  • “未安装且未删除”~=“全部”
还有一些由于复杂性()而需要进行测试:

  • 已安装且(不是删除=“全部”或升级ProductCode)
  • 未安装或未安装(未删除=“全部”或升级ProductCode)

我希望这是一个明确的概念。我有一个用于此类属性调试的VBScript,但它太大、太乱,无法放在这里。

根据这篇关于Windows 10和Server 2016的VersionNT值的文章:

我将从以下条件开始:

VersionNT=603且MsiNTProductType>1

其中后者表示服务器系统:

除此之外,请查看WindowsBuild属性,查看它是否对Server 2016有有用的值(或者可以用于排除Server 2012的值)。您还可以查看调用GetSystemMetrics的自定义操作:

查看是否在2012年设置了SM_SERVERR2


您不需要包含Installed属性的条件。首次安装时,未设置安装值。如果您再次尝试安装相同的MSI,您将无法达到启动条件,因为Windows将看到此特定产品代码已安装并进入维护模式(修复、卸载、功能更改类型)。所以不清楚你为什么认为你需要它。如果需要确保启动条件仅适用于初始安装,请将条件“未安装”添加到UI中的LaunchConditions操作并执行序列

使用“VersionNT=603和MsiNTProductType>1”仍将允许用户安装Windows Server 2012R2。这正是我现在使用的代码。我想阻止在服务器2012 R2上安装。嗨,Phil。我认为包含OR'd Installed属性是为了强制条件在原始安装后始终为true,以便在修改、修复或卸载(这将是一个带有不可卸载包的catch 22)时,启动条件永远不会为false。假设条件检查安装后已卸载的运行时,则产品将拒绝卸载,因为启动条件为false。我认为这是一款门兴/Arnson特辑:-)。对于Batmobile.Stein:我通常认为,在UI中的LaunchConditions操作和执行序列中,使用“未安装”条件可以解决该问题,以避免混淆实际条件下的复杂值。有意义-应该是标准值吗?在修改、修复、修补或卸载模式下运行启动条件是否有意义?我猜如果(托管)自定义操作缺少运行时,那么它们无论如何都会崩溃?我发现启动条件有问题。为什么不使用server 2012 r2?你支持2008 r2吗?只有2016+年?我喜欢阻止操作系统中缺少的功能,而不是操作系统的名称/版本。