條件語句語法

本節描述 MsiEvaluateCondition 函式和動作順序數據表所使用的條件語句語法。 如需詳細資訊,請參閱 條件語句語法的範例。

條件語句語法的摘要

下表和下列清單摘要說明在條件表達式中使用的語法。

項目 語法
value 符號 |literal |整數
comparison-operator < | > | <= | >= | = | | <>
術語 value |value comparison-operator value |( 運算式 )|
布爾因數 term | NOT 字詞
布爾值字詞 布爾因數 |布爾因數 AND 字詞
expression 布爾值字詞 |布爾字詞 OR 表達式
符號 屬性 |%environment-variable |$component-action | ?component-state |&feature-action | !feature-state

 

  • 符號名稱和值會區分大小寫。

  • 環境變數名稱不區分大小寫。

  • 常值文字必須以引號 (“text” ) 括住。

    注意

    包含引號的常值文字不能用於條件語句中,因為常值文字中沒有引號的逸出字元。 若要比較包含引號的常值文字,常值文字應該放在 屬性中。 例如,若要確認 SERVERNAME 屬性不包含任何引號,請在 Property 資料表定義名為 QUOTES 的屬性,並將條件變更為 NOT SERVERNAME><QUOTES。

     

  • 不存在的屬性值會被視為空字串。

  • 不支援浮點數值。

  • 運算子和優先順序與 BASIC 和 SQL 語言相同。

  • 不支持算術運算子。

  • 括號可用來覆寫運算符優先順序。

  • 運算子不區分大小寫。

  • 針對字串比較,前置詞為 運算符的tilde “~” 會執行不區分大小寫的比較。

  • 整數與無法轉換成整數的字串或屬性值比較一律 是 msiEvaluateConditionFalse,但比較運算符 “<>”除外,它會傳 回 msiEvaluateConditionTrue

存取前置詞

下表顯示用來存取各種系統和安裝程式資訊的前置詞,以用於條件表達式。

符號類型 前置詞
Installer 屬性 (無) property (Property) 數據表的值。
環境變數 % 環境變數的值。
元件數據表索引鍵 $ 元件的動作狀態。
元件數據表索引鍵 ? 元件的已安裝狀態。
功能數據表索引鍵 & 功能的動作狀態。
功能數據表索引鍵 ! 功能已安裝的狀態。

 

邏輯運算子

下表顯示條件表達式中的邏輯運算符,優先順序高到低。

運算子 意義
Not 前置詞一元運算符;反轉下列字詞的狀態。
如果這兩個詞彙都是 TRUE,則為 TRUE。
Or 如果任一或兩個詞彙都是 TRUE,則為 TRUE。
Xor 如果兩個詞彙都為TRUE,則為TRUE。
Eqv 如果兩個詞彙都是 TRUE,或兩個詞彙都是 FALSE,則為 TRUE。
進出口 如果左字詞為 FALSE 或右字詞為 TRUE,則為 TRUE。

 

比較運算子

下表顯示條件表示式中使用的比較運算元。 這些比較運算子只能在兩個值之間發生。

運算子 意義
= 如果左值等於右值,則為TRUE。
<> 如果左值不等於右值,則為TRUE。
> 如果左值大於右值,則為TRUE。
>= 如果左值大於或等於右值,則為TRUE。
< 如果左值小於右值,則為TRUE。
<= 如果左值小於或等於右值,則為TRUE。

 

子字串運算子

下表顯示條件表示式中使用的子字串運算符。 子字串運算子可以在兩個字串值之間發生。

運算子 意義
>< 如果左字串包含右字串,則為TRUE。
<< 如果左字串以右字串開頭,則為TRUE。
>> 如果左字串以右字串結尾,則為TRUE。

 

位數值運算子

下表顯示條件表示式中的位數值運算元。 這些運算子可以在兩個整數值之間發生。

運算子 意義
>< 位 AND,如果左右整數有任何一般位,則為 TRUE。
<< 如果左整數的高 16 位等於右整數,則為 True。
>> 如果左整數的低 16 位等於右整數,則為 True。

 

功能與元件狀態值

下表顯示使用功能和元件運算符號的有效位置。

運算子 <狀態> 此語法有效之處
$component動作 Condition 數據表中,以及在 Sequence 數據表中,於 CostFinalize 宏指令之後
&feature-action Condition 數據表中,以及在 Sequence 數據表中,於 CostFinalize 宏指令之後
!feature-state Condition 數據表中,以及在 Sequence 數據表中,於 CostFinalize 宏指令之後
?component-state Condition 數據表中,以及在 Sequence 數據表中,於 CostFinalize 宏指令之後

 

下表顯示條件表示式中使用的功能和元件狀態值。 在直接呼叫 MsiSetInstallLevel 或 CostFinalize 動作之前,不會設定這些狀態。

州/省 意義
INSTALLSTATE_UNKNOWN -1 在功能或元件上不採取任何動作。
INSTALLSTATE_ADVERTISED 1 已公告的功能。 此狀態不適用於元件。
INSTALLSTATE_ABSENT 2 功能或元件不存在。
INSTALLSTATE_LOCAL 3 本機電腦上的功能或元件。
INSTALLSTATE_SOURCE 4 從來源執行功能或元件。

 

例如,條件表達式 “&MyFeature=3” 只有在 MyFeature 從目前狀態變更為本機計算機上安裝的狀態時,才會評估為 True,INSTALLSTATE_LOCAL。

請注意,您不應該根據條件$Component 1=3 來檢查是否在本機計算機上安裝 Component1。 如果 Component1 是由一個以上的產品安裝,這可能會失敗。 在 Product1 在本機安裝 Component1 之後,安裝程式會將 Product2 安裝期間的條件評估為 false $Component 1=3。 這是因為安裝程式會使用元件的金鑰路徑來判斷元件的版本,如果元件的版本大於或等於已安裝的元件,則會標示元件進行安裝。

請注意,安裝程式不會在條件語句中直接比較 Version 數據類型。 例如,您無法使用比較運算符來比較條件語句中的 「01.10」 和 「1.010」 等版本。 請改用有效的方法來搜尋版本,例如搜尋現有應用程式、檔案、登錄專案或 .ini 檔案專案中所述,然後設定屬性。

在條件語句中使用屬性