MSIEXECコマンドラインから「チェックされていない」ようにチェックボックスを設定するにはどうすればよいですか?
-
24-10-2019 - |
質問
カスタムプロパティにバインドされたチェックボックスを持っているMSI(WIXを使用した)があります(my_propertyと呼ばれます)。このプロパティに0(チェックされていない)または1(チェック)を指定して、コマンドラインからこのMSIを実行したいと思います。私のスクリプトは、適切な値(環境に基づいて)を決定し、その値をmsiexecコマンドラインに注入します。私のコマンドラインは次のように見えます:
msiexec /i my_installer.msi MY_PROPERTY=$value
環境に応じて、$値は1または0です。問題は、コマンドラインでmy_propertyにどのような価値を提供しても、チェックボックスは常にチェックされます(そして、プロパティは常に1に設定されます)。チェックボックスをチェックしないようにする唯一の方法は、プロパティを指定しないことです(未定義のまま)。この動作は、UIが表示されているかどうかに関係なく発生することに注意する必要があります(上記のコマンドラインに「/静か」を追加しても、この動作は変わりません)。
このMSDN投稿 これは、Windowsインストーラーで既知の「バグ」であることを示しているようです(または、より正確には、オーサリングシステムがMSIを書いたもの)。ビルド後のMSIハックがソリューションとして提案されています。誰かがこの問題に遭遇し、より良い回避策/解決策を考え出したかどうか疑問に思っています。ありがとう!
アップデート
この問題の3つの解決策があります。
- @Damienから、ラッパースクリプトは、値が0の場合、プロパティをMSIEXECに渡さないようにします。これにより、スクリプトがより複雑になり、おそらく「チェック」されたデフォルトのチェックボックスの値をオーバーライドできないようになります。
- @Michael Urmanから、その値がゼロの場合、プロパティをクリアするカスタムアクションを追加します。これにより、MSIがより複雑になり、UIのすべてのチェックボックスにこのようなカスタムアクションを追加する必要があります。
- 別のアイデアは、MSIインストーラーでのチェックボックスの使用を単純に許可し、代わりに「True/False」の質問にラジオボックスまたはドロップダウンを使用することです。これにより、インストーラーのUIオプションが制限されていますが、ラッパースクリプトをシンプルに保つことができ、プロパティを「ハッキング」するためにカスタムアクションを必要としません。
私は現在オプション3に傾いていますが、オプション1はおそらく私の元の質問に対する最良の答えです。何かご意見は?
解決
これは、動作することが「想定される」方法です。基本的に、ユーザーがチェックボックスをチェックするまでプロパティは存在しません。したがって、チェックボックスがチェックされたときにカスタムアクションを実行する場合は、カスタムプロップが設定されている値をチェックする代わりに、カスタムアクションを実行する条件としてプロパティの存在をテストします。
コマンドラインからこれを処理する最良の方法は、すでに述べたものだと思います。チェックボックスを選択したい場合は、コマンドラインのカスタムプロップを指定します。
他のヒント
発見したように、プロパティが定義されている場合(非blank)およびfalse(unチェック)プロパティが未定義の場合(空白)チェックボックスがtrue(チェック)されます。環境1または0の文字列をtrue/falseチェックボックスに変換する必要があるように聞こえます。1または0がコマンドラインで渡されます。あなたのプロパティをに設定するセットプロパティカスタムアクションを使用してみてください {}
(空白)プロパティがすでにあるときの状態 "0"
. 。インストールUIとインストールの両方のSEACENCESの両方の早い段階でスケジュールします。
更新後期: 複数のチェックボックスでこれを処理するための複数のカスタムアクションの必要性については、選択肢があります。複数のセットプロパティアクションを作成することができます(利点:彼らが何をしているのかを簡単に伝えることができます;コスト:それらの多く)、または歩行する単一のコードベースのカスタムアクションを作成することができます Checkbox
テーブル から変換するプロパティのリストの場合 0
ブランク(利点:1つのアクション;コスト:文書化が不十分、カスタムコード)。後者のアプローチに対する二次的な利点は、珍しいことを処理できることです Value
設定、プロパティをに設定するようなチェックボックス 0
チェックしたとき。