条件语句语法

本部分介绍 MsiEvaluateCondition 函数和操作顺序表使用的条件语句的语法。 有关详细信息,请参阅条件语句语法示例

条件语句语法摘要

此表和以下列表汇总了在条件表达式中使用的语法。

项目 语法
value symbol | literal | integer
比较运算符 < | > | <= | >= | = | <>
关键词 value | value comparison-operator value | ( expression )|
布尔因子 term | NOT term
布尔项 Boolean-factor | Boolean-factor AND term
表达式 Boolean-term | Boolean-term OR expression
符号 property | %environment-variable | $component-action | ?component-state | &feature-action | !feature-state

 

  • 符号名称和值区分大小写。

  • 环境变量名称不区分大小写。

  • 文本必须用引号括住 ("text")。

    注意

    不能在条件语句中使用包含引号的文本,因为文本中的引号没有转义字符。 若要与包含引号的文本进行比较,应将文本放入属性中。 例如,若要验证 SERVERNAME 属性是否不包含引号,请在 Property 表中定义一个名为 QUOTES、值为 " 的属性,并将条件更改为 NOT SERVERNAME><QUOTES。

     

  • 不存在的属性值被视为空字符串。

  • 不支持浮点数值。

  • 运算符和优先顺序与 BASIC 和 SQL 语言中相同。

  • 不支持算术运算符。

  • 括号可用于替代运算符优先顺序。

  • 运算符不区分大小写。

  • 对于字符串比较,运算符前面的波浪符“~”执行不区分大小写的比较。

  • 将整数与无法转换为整数的字符串或属性值进行比较始终会返回 msiEvaluateConditionFalse,但使用比较运算符“<>”时除外,它返回 msiEvaluateConditionTrue。

访问前缀

下表显示了用于访问条件表达式中使用的各种系统和安装程序信息的前缀。

符号类型 前缀
Installer 属性 (无) 属性 (Property) 表的值。
环境变量 % 环境变量的值。
Component 表键 $ 组件的操作状态。
Component 表键 ? 组件的安装状态。
Feature 表键 & 功能的操作状态。
Feature 表键 ! 功能的安装状态。

 

逻辑运算符

下表按照从高到低的优先顺序显示了条件表达式中的逻辑运算符。

运算符 含义
Not 前缀一元运算符;反转下一个项的状态。
如果两个项均为 TRUE,则为 TRUE。
如果任一项或两个项为 TRUE,则为 TRUE。
Xor 如果任一项为 TRUE,但并非两个项均为 TRUE,则为 TRUE。
Eqv 如果两个项均为 TRUE 或两个项均为 FALSE,则为 TRUE。
Imp 如果左侧项为 FALSE 或右侧项为 TRUE,则为 TRUE。

 

比较运算符

下表显示了条件表达式中使用的比较运算符。 这些比较运算符只能在两个值之间出现。

运算符 含义
= 如果左侧值等于右侧值,则为 TRUE。
<> 如果左侧值不等于右侧值,则为 TRUE。
> 如果左侧值大于右侧值,则为 TRUE。
>= 如果左侧值大于或等于右侧值,则为 TRUE。
< 如果左侧值小于右侧值,则为 TRUE。
<= 如果左侧值小于或等于右侧值,则为 TRUE。

 

子字符串运算符

下表显示了条件表达式中使用的子字符串运算符。 子字符串运算符可以出现在两个字符串值之间。

运算符 含义
>< 如果左侧字符串包含右侧字符串,则为 TRUE。
<< 如果左侧字符串以右侧字符串开头,则为 TRUE。
>> 如果左侧字符串以右侧字符串结尾,则为 TRUE。

 

按位数值运算符

下表显示了条件表达式中的按位数值运算符。 这些运算符可以出现在两个整数值之间。

运算符 含义
>< 按位 AND,如果左右侧整数具有任何共同位,则为 TRUE。
<< 如果左侧整数的高 16 位等于右侧整数,则为 True。
>> 如果左侧整数的低 16 位等于右侧整数,则为 True。

 

功能和组件状态值

下表显示了在哪种情况下可以使用功能和组件运算符符号。

运算符 <状态> 此语法有效的场合
$component-action Condition 表和顺序表中的 CostFinalize 操作之后。
&feature-action Condition 表和顺序表中的 CostFinalize 操作之后。
!feature-state Condition 表和顺序表中的 CostFinalize 操作之后。
?component-state Condition 表和顺序表中的 CostFinalize 操作之后。

 

下表显示了条件表达式中使用的功能和组件状态值。 在直接调用或通过 CostFinalize 操作调用 MsiSetInstallLevel 之前不会设置这些状态。

状态 含义
INSTALLSTATE_UNKNOWN -1 不会对功能或组件执行任何操作。
INSTALLSTATE_ADVERTISED 1 播发的功能。 此状态不适用于组件。
INSTALLSTATE_ABSENT 2 功能或组件不存在。
INSTALLSTATE_LOCAL 3 本地计算机上的功能或组件。
INSTALLSTATE_SOURCE 4 功能或组件从源运行。

 

例如,仅当 MyFeature 从其当前状态更改为本地计算机上的安装状态 INSTALLSTATE_LOCAL 时,条件表达式“&MyFeature=3”才计算为 True。

请注意,不要依赖于使用条件 $Component1=3 来检查是否在计算机本地安装了 Component1。 如果 Component1 已由多个产品安装,则此项检查可能会失败。 Product1 在本地安装 Component1 后,安装程序会在安装 Product2 期间将条件 $Component1=3 计算为 False。 这是因为,安装程序将使用组件的密钥路径来确定组件的版本,如果其版本大于或等于已安装的组件,则它会将组件标记为安装。

请注意,安装程序不会直接比较条件语句中的 Version 数据类型。 例如,不能使用比较运算符来比较条件语句中“01.10”和“1.010”之类的版本。 应该按照搜索现有应用程序、文件、注册表项或 .ini 文件条目中所述,使用有效的方法来搜索版本,然后设置属性。

在条件语句中使用属性