WixのCustom ActionでPowerShellからbatファイルを呼ぶ方法

大変に悪戦苦闘したので残しておきます。

UAC絡みの件で、PowerShell経由でレジストリの書き換え処理をしたい場合などに使用します。普通であれば.batファイルを呼べばいいだけです。

とにかくリターンコード(exit 0)をきっちり返してあげないと、いつまでも待ち続けて処理が完了いたしません。

POWERSHELLのEXEファイルの位置をプロパティにセット

        <Property Id="POWERSHELLEXE">
            <RegistrySearch Id="POWERSHELLEXE" Type="raw" Root="HKLM" Key="SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" Name="Path" />
        </Property>

CustomActionを定義します

        <CustomAction Id="hoge" Property="HOGE" Value="&quot;[POWERSHELLEXE]&quot; -NoProfile -NonInteractive -InputFormat None -Command &quot;Start-Process [PATH_TO_FILE]hoge.bat -verb runas -WindowStyle Hidden -Wait&quot;" />

補足しておくと

-NoProfile -NonInteractive -InputFormat None

あたりはおまじない的に書いておけばよさそう。

管理者権限で実行するため

-verb runas

を渡しておきます。

管理者権限で別ウィンドウで開いて実行するため、

-WindowStyle Hidden

は使えますが、

-NoNewWindow

は使えません。

hoge.bat

#何かしらの処理を書く

exit 0

最後きっちり exit 0 を書いておきましょう。

exit /B 0

にする場合はPowerShell側でもexit 0 を返すようにします。

&quot;Start-Process [PATH_TO_FILE]hoge.bat -verb runas -WindowStyle Hidden -Wait;exit 0&quot;