条件语句语法
本部分介绍 MsiEvaluateCondition 函数和作 序列表使用的条件语句的语法。 有关详细信息,请参阅 条件语句语法的示例。
条件语句语法摘要
下表和以下列表汇总了在条件表达式中使用的语法。
项目 | 语法 |
---|---|
价值 | symbol |literal |整数 |
comparison-operator | < |> |<= |>= |= |<> |
术语 | value |value comparison-operator value |( 表达式 )| |
布尔因子 | term |不 术语 |
Boolean-term | 布尔因子 |布尔因子 AND 术语 |
表达 | 布尔术语 |布尔术语 OR 表达式 |
象征 | 属性 |%environment-variable |$component-action | ?component-state |&feature-action | !feature-state |
符号名称和值区分大小写。
环境变量名称不区分大小写。
文本文本必须括在引号(“text”)之间。
注意
包含引号的文本不能用于条件语句中,因为文本文本中没有引号的转义字符。 若要与包含引号的文本文本进行比较,文本文本应放在属性中。 例如,若要验证 SERVERNAME 属性是否不包含任何引号,请在 属性表中定义一个名为 QUOTES 的属性,其值为“,并将条件更改为 NOT SERVERNAME><QUOTES。
不存在的属性值被视为空字符串。
不支持浮点数值。
运算符和优先级与 BASIC 和 SQL 语言相同。
不支持算术运算符。
括号可用于替代运算符优先级。
运算符不区分大小写。
对于字符串比较,前缀为运算符的波形符“~”执行不区分大小写的比较。
不能转换为整数的字符串或属性值的整数比较始终 msiEvaluateConditionFalse,但比较运算符“<>”除外,该运算符返回 msiEvaluateConditionTrue。
访问前缀
下表显示了用于访问各种系统和安装程序信息的前缀,以便在条件表达式中使用。
符号类型 | 前缀 | 价值 |
---|---|---|
Installer 属性 | (无) | 属性的值(属性) 表。 |
环境变量 | % | 环境变量的值。 |
组件表键 | $ | 组件的作状态。 |
组件表键 | ? | 组件的已安装状态。 |
功能表键 | & | 功能的作状态。 |
功能表键 | ! | 该功能的已安装状态。 |
逻辑运算符
下表按高到低优先级的顺序显示条件表达式中的逻辑运算符。
算子 | 意义 |
---|---|
不 | 前缀一元运算符;反转以下术语的状态。 |
和 | 如果两个术语均为 TRUE,则为 TRUE。 |
或 | 如果任一术语或两个术语均为 TRUE,则为 TRUE。 |
异或 | 如果两个术语都为 TRUE,则为 TRUE。 |
Eqv | 如果两个术语均为 TRUE 或两个术语均为 FALSE,则为 TRUE。 |
小鬼 | 如果左术语为 FALSE 或右术语为 TRUE,则为 TRUE。 |
比较运算符
下表显示了条件表达式中使用的比较运算符。 这些比较运算符只能在两个值之间发生。
算子 | 意义 |
---|---|
= | 如果左值等于右值,则为 TRUE。 |
<> | 如果左值不等于右值,则为 TRUE。 |
> | 如果左值大于右值,则为 TRUE。 |
>= | 如果左侧值大于或等于右值,则为 TRUE。 |
< | 如果左值小于右值,则为 TRUE。 |
<= | 如果左侧值小于或等于右侧值,则为 TRUE。 |
子字符串运算符
下表显示了条件表达式中使用的子字符串运算符。 子字符串运算符可以在两个字符串值之间发生。
算子 | 意义 |
---|---|
>< | 如果左侧字符串包含右侧字符串,则为 TRUE。 |
<< | 如果左侧字符串以右字符串开头,则为 TRUE。 |
>> | 如果左字符串以右字符串结尾,则为 TRUE。 |
按位数字运算符
下表显示了条件表达式中的按位数值运算符。 这些运算符可以在两个整数值之间发生。
算子 | 意义 |
---|---|
>< | 按位 AND,如果左右整数具有任何共同位,则为 TRUE。 |
<< | 如此 如果左整数的高 16 位等于右整数。 |
>> | 如此 如果左整数的低 16 位等于右整数。 |
功能和组件状态值
下表显示了使用功能和组件运算符符号的有效位置。
运算符 <状态> | 此语法有效位置 |
---|---|
$component作 | 在 条件 表中,在 序列 表中,CostFinalize作之后。 |
&功能作 | 在 条件 表中,在 序列 表中,CostFinalize作之后。 |
!feature-state | 在 条件 表中,在 序列 表中,CostFinalize作之后。 |
?component-state | 在 条件 表中,在 序列 表中,CostFinalize作之后。 |
下表显示了条件表达式中使用的功能和组件状态值。 在直接或通过 CostFinalize作调用 msiSetInstallLevel 之前,才会设置这些状态。
州 | 价值 | 意义 |
---|---|---|
INSTALLSTATE_UNKNOWN | -1 | 不对功能或组件执行任何作。 |
INSTALLSTATE_ADVERTISED | 1 | 播发的功能。 此状态不适用于组件。 |
INSTALLSTATE_ABSENT | 2 | 功能或组件不存在。 |
INSTALLSTATE_LOCAL | 3 | 本地计算机上的功能或组件。 |
INSTALLSTATE_SOURCE | 4 | 功能或组件从源运行。 |
例如,仅当 MyFeature 从当前状态更改为本地计算机上安装的状态时,条件表达式“&MyFeature=3”的计算结果为 True,INSTALLSTATE_LOCAL。
请注意,不应依赖于条件$Component 1=3 来检查是否在本地安装了 Component1。 如果 Component1 由多个产品安装,则可能会失败。 在 Product1 在本地安装 Component1 后,安装程序在安装 Product2 期间将条件 $Component 1=3 评估为 False。 这是因为安装程序使用组件的密钥路径确定组件的版本,如果组件的版本大于或等于已安装组件,则将其标记为安装。
请注意,安装程序不会在条件语句中直接比较 版本 数据类型。 例如,不能使用比较运算符比较条件语句中的“01.10”和“1.010”等版本。 请改用有效的方法来搜索版本,如 搜索现有应用程序、文件、注册表项或 .ini 文件条目,然后设置属性。
相关主题