条件付きステートメントの構文

このセクションでは、MsiEvaluateCondition 関数とアクション シーケンス テーブルで使われる条件付きステートメントの構文について説明します。 詳細については、「条件付きステートメント構文の例」を参照してください。

条件付きステートメントの構文の概要

この表と次の一覧は、条件式で使う構文をまとめたものです。

項目 構文
value symbol | literal | integer
comparison-operator < | > | <= | >= | = | <>
語句 value | value comparison-operator value | ( expression )|
Boolean-factor term | NOT term
Boolean-term Boolean-factor | Boolean-factor AND term
expression Boolean-term | Boolean-term OR expression
記号 property | %environment-variable | $component-action | ?component-state | &feature-action | !feature-state

 

  • シンボルの名前と値は大文字と小文字が区別されます。

  • 環境変数名では大文字と小文字は区別されません。

  • リテラル テキストは、引用符 ("テキスト") で囲む必要があります。

    Note

    リテラル テキスト内に引用符のエスケープ文字がないため、引用符を含むリテラル テキストは条件付きステートメントに使用できません。 引用符を含むリテラル テキストに対して比較を行うには、リテラル テキストをプロパティに設定する必要があります。 たとえば、SERVERNAME プロパティに引用符が含まれていないことを確認するには、Property テーブルに QUOTES というプロパティを " という値で定義し、条件を NOT SERVERNAME><QUOTES に変更します。

     

  • 存在しないプロパティ値は、空の文字列として扱われます。

  • 浮動小数点数値はサポートされていません。

  • 演算子と優先順位は、BASIC 言語と SQL 言語で同じです。

  • 算術演算子はサポートされていません。

  • かっこを使うと、演算子の優先順位をオーバーライドできます。

  • 演算子では、大文字と小文字は区別されません。

  • 文字列比較の場合、演算子の前にチルダ "~" を付けると、大文字と小文字を区別しない比較が実行されます。

  • 整数と、整数に変換できない文字列またはプロパティ値との比較は、常に msiEvaluateConditionFalse になります。ただし、比較演算子 "<>" の場合は例外であり、msiEvaluateConditionTrue が返されます。

アクセス プレフィックス

次の表は、条件式に使うさまざまなシステムとインストーラーの情報にアクセスするために使うプレフィックスを示したものです。

シンボル型 Prefix
Installer プロパティ (なし) プロパティ (Property) テーブルの値。
環境変数 % 環境変数の値。
Component テーブル キー $ コンポーネントのアクション状態。
Component テーブル キー ? コンポーネントのインストール状態。
Feature テーブル キー & 機能のアクション状態。
Feature テーブル キー ! 機能のインストール状態。

 

論理演算子

次の表は、条件式の論理演算子を、優先順位の高い順に示したものです。

演算子 説明
Not プレフィックス単項演算子。次の項の状態を反転します。
および 両方の項が TRUE の場合は TRUE。
または どちらか一方、または両方の項が TRUE の場合は TRUE。
Xor どちらか一方の項のみが TRUE の場合は TRUE。
Eqv 両方の項が TRUE または両方の項が FALSE の場合は TRUE。
Imp 左項が FALSE、右項が TRUE の場合は TRUE。

 

比較演算子

次の表は、条件式で使われる比較演算子を示したものです。 これらの比較演算子は、2 つの値の間にのみ使用できます。

演算子 説明
= 左の値が右の値と等しい場合は TRUE。
<> 左の値が右の値と等しくない場合は TRUE。
> 左の値が右の値より大きい場合は TRUE。
>= 左の値が右の値以上の場合は TRUE。
< 左の値が右の値未満の場合は TRUE。
<= 左の値が右の値以下の場合は TRUE。

 

部分文字列演算子

次の表は、条件式で使われる部分文字列演算子を示したものです。 部分文字列演算子は、2 つの文字列値の間に使用できます。

演算子 説明
>< 左の文字列が右の文字列を含む場合は TRUE。
<< 左の文字列が右の文字列で始まる場合は TRUE。
>> 左の文字列が右の文字列で終了する場合は TRUE。

 

ビットごとの数値演算子

次の表は、条件式でのビットごとの数値演算子を示しています。 これらの演算子は、2 つの整数値の間に使用できます。

演算子 説明
>< ビットごとの AND。左と右の整数に共通するビットがある場合は TRUE。
<< 左の整数の上位 16 ビットが右の整数と等しい場合は True。
>> 左の整数の下位 16 ビットが右の整数と等しい場合は True。

 

機能とコンポーネント状態の値

次のテーブルは、機能とコンポーネントの演算子記号の使用が有効な場所を示しています。

演算子の<状態> この構文が有効な場所
$component-action Condition テーブル内、sequence テーブル内、CostFinalize アクションの後。
&feature-action Condition テーブル内、sequence テーブル内、CostFinalize アクションの後。
!feature-state Condition テーブル内、sequence テーブル内、CostFinalize アクションの後。
?component-state Condition テーブル内、sequence テーブル内、CostFinalize アクションの後。

 

次のテーブルは、条件式で使われる機能とコンポーネントの状態値を示しています。 これらの状態は、MsiSetInstallLevel メソッドが直接または CostFinalize アクションによって呼び出されるまで設定されません。

State 説明
INSTALLSTATE_UNKNOWN -1 その機能またはコンポーネントに対して実行されるアクションはありません。
INSTALLSTATE_ADVERTISED 1 アドバタイズされた機能。 この状態は、コンポーネントでは使用できません。
INSTALLSTATE_ABSENT 2 機能またはコンポーネントは存在しません。
INSTALLSTATE_LOCAL 3 ローカル コンピューター上の機能またはコンポーネント。
INSTALLSTATE_SOURCE 4 ソースから実行される機能またはコンポーネント。

 

たとえば、"&MyFeature=3" という条件式が True に評価されるのは、MyFeature が現在の状態からローカル コンピューターにインストールされている状態 (INSTALLSTATE_LOCAL) に変わる場合のみです。

Component1 がコンピューターのローカルにインストールされているかどうかを確認するには、$Component1=3 という条件に頼るべきではないことに注意してください。 これは、Component1 が複数の製品によってインストールされている場合に失敗する可能性があります。 Product1 によって Component1 がローカルにインストールされた後、Product2 のインストール時に、インストーラーは $Component1=3 という条件を False と評価します。 これは、インストーラーがコンポーネントのキー パスを使ってコンポーネントのバージョンを判断し、そのバージョンがインストールされているコンポーネント以降である場合に、そのコンポーネントをインストール対象としてマークするためです。

インストーラーは、条件付きステートメント内で Version データ型の直接比較を行わないことに注意してください。 たとえば、条件付きステートメント内で比較演算子を使って "01.10" や "1.010" のようなバージョンを比較することはできません。 代わりに、「既存のアプリケーション、ファイル、レジストリエントリ、または .ini ファイルのエントリを検索する」で説明されているような、有効な方法を使ってバージョンを検索し、プロパティを設定します。

条件付きステートメントでのプロパティの使用