條件語句語法
本節描述 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 檔案專案中所述,然後設定屬性。
相關主題