Lesson 6 COM、式の構文、その他
2. 式の構文
私たちは既に条件式を使った事があります。 中でも、Condition タグと Publish タグで、条件式を使いました。 NOT, AND, OR のような論理演算子も、<, >, = のような比較演算子も知っています。 以下に優先順位に従って、すべての演算子を記載します。
論理演算子
- NOT : 前置単項演算子。次に来る項の論理値を反転させる。
- AND : 論理積 (両方が 真 なら、真)
- OR : 論理和 (どちらかまたは両方が 真 なら、真)
- XOR : 排他的論理和 (どちらか一方だけが 真 なら、真)
- EQV : 等値 (どちらも 真 か、どちらも 偽 なら、真)
- IMP : 含意 (左 が 偽 か、右 が 真 なら、真)
比較演算子
- = : 等しい
- <> : 等しくない
- > : より大きい
- >= : より大きいか、または、等しい
- < : より小さい
- <= : より小さいか、または、等しい
- ˜= : 等しい (大文字と小文字を区別しない)
- ˜<> : 等しくない (大文字と小文字を区別しない)
- ˜> : より大きい (大文字と小文字を区別しない)
- ˜>= : より大きいか、または、等しい (大文字と小文字を区別しない)
- ˜< : より小さい (大文字と小文字を区別しない)
- ˜<= : より小さいか、または、等しい (大文字と小文字を区別しない)
部分文字列演算子 (文字列間のみ)
- >< : 左 は 右 を含んでいる
- « : 左 は 右 から始まっている
- » : 左 は 右 で終っている
ビット演算子 (整数間のみ)
- >< : ビット単位の AND
- « : 左 の上位16ビットが 右 に等しい
- » : 左 の下位16ビットが 右 に等しい
XML では普通のことですが、かぎ括弧を使うときは、間違って XML のタグの開始文字または終了文字として解釈されないように
注意しなければならない、ということを心に留めてください。
曖昧さを排するためには、XML の文字データ・メカニズムを使って、そういう条件をエスケープしなければなりません。
条件式を <![CDATA[
と ]]>
で囲むのです。
最も安全な方法は条件式を全てラップすることでしょう (WiX のデコンパイラ、Dark はまさしくそうします)。 けれども — 少なくとも私の考えでは — それではソースがあまりにも読みにくくなります。 それが嫌なら、本当に必要な所だけにラッパーを使うために、どの式が曖昧でどの式がそうでないかについて自分で配慮しなければなりません (何か理解できない所があれば、コンパイラがエラー・メッセージを出してくれます)。 どちらを選ぶかは、あなた次第です …
式の中のプロパティ
これらの式の中において、プロパティ名を使うことが出来ます (プロパティ名は大文字と小文字を区別することを思い出して下さい)。 存在しないプロパティ名は空の文字列として扱われます。 プロパティの論理値は、プロパティが設定されているか否か、という事を示します — つまり、単にプロパティを使うだけでは、そのプロパティが持つ論理値をチェックすることは 出来ない、という事です。
- PROPERTY : プロパティが設定されていて何らかの値を持っていれば、たとえその値が偽であっても、真と評価されます。
- NOT PROPERTY : プロパティが全く設定されていない場合に真と評価されます。
プレフィックス
いくつかの特殊な文字を名前の前に付けると、特別な意味になります。
- % : 環境変数 (名前は大文字と小文字を区別しません)
- $ : コンポーネントのアクション後の状態
- ? : コンポーネントの現在のインストール状態
- & : 機能のアクション後の状態
- ! : 機能の現在のインストール状態
後の四つは次の整数値を取り得ます。
- -1 : どんなアクションも実行されない
- 1 : アドバタイズされている (機能についてのみ該当)
- 2 : インストールされていない
- 3 : ローカル・コンピュータ上にインストールされている
- 4 : ソースから実行される
より明確にするために、いくつか例を挙げましょう。
- (&FeatureName = 3) AND NOT (!FeatureName = 3) :
製品がローカルにインストールされる場合にだけアクションを実行します。再インストールの場合はアクションを実行しません。
&FeatureName = 3
という項は、アクションがその機能をローカルにインストールするものであることを意味します。NOT (!FeatureName = 3)
という項は、その機能がローカルにインストールされていないことを意味します。 - (&FeatureName = 2) AND (!FeatureName = 3) : その機能がアンインストールされる場合にだけアクションを実行します。 この条件式は、機能がローカルにインストールされている状態から存在しない状態へと遷移する場合だけを捕まえます。
- (?ComponentName = 3) AND ($ComponentName = 2 OR $ComponentName = 4) :
コンポーネントがローカルにインストールされていて、そうでない状態へと遷移する場合にだけ、アクションを実行します。
?ComponentName = 3
という項は、コンポーネントがローカルにインストールされていることを意味します。$ComponentName = 2
という項は、コンポーネントのアクション後の状態が「存在しない」であることを意味します。$ComponentName = 4
という項は、コンポーネントのアクション後の状態が「ソースから実行される」であることを意味します。 コンポーネントに対しては、「アドバタイズされている」という状態は当てはまらないことに注意して下さい。 - ?ComponentName = $ComponentName : コンポーネントが(現在と同じ状態で)再インストールされる場合にだけアクションを実行します。