とにかく、ファイルにログを記録する代わりにmsiexecをstdoutにエコーさせる方法はありますか


8

継続的デリバリーパイプラインの一部として、特定のマシンにmsiをインストールしたいと思います。msiexecとpsexecはこれを完全に実行しますが、msiexecはファイルにのみログを記録できるようで、stdout / stderrにログを記録する必要があります。

現在、出力をCIソフトウェアに戻すには、ログの内容をエコーする2番目のステップを追加する必要がありますが、これは少し無意味なようです。

誰かが以前にこの問題に直面しました(そしてそれを克服しましたか?)

ここで助けてくれてありがとう。

マーク


msiexecの組み込みファイルロギングを使用し、ディスクから読み戻します。インストール中にいくつかのmsiexec.exeプロセスが起動される可能性があり、それらすべての出力をリダイレクトするのは難しいと思います。自動的に生成されたmsiexec.exeプロセスがさまざまなセキュリティコンテキストで実行され、カスタムアクションを実行するために表示される場合があります。対処したいワームの缶。
SteinÅsmul2014年

回答:


5

私はこれをもう一度チェックしました、そしてここにいくつかの更新された情報があります

MSI GUIを抑制し、サードパーティによって実装された外部GUIを設定することが可能です。この外部GUIは、インストールの実行時にmsiexec.exeからメッセージを受信できます。これは主にカスタムプログレスバーを実装するためのものですが、他のほとんどのエラーメッセージとステータスメッセージを傍受することもできます:MsiSetExternalUI関数

興味深いパラメーターはdwMessageFilterです。これを設定することで、たとえば、インストール中に発生したエラーメッセージのみを受け取ることができます。ほとんどの場合これで十分でしょう。

INSTALLUI_HANDLER MsiSetExternalUI(
  _In_  INSTALLUI_HANDLER puiHandler,
  _In_  DWORD dwMessageFilter,
  _In_  LPVOID pvContext
);

残念ながら、現時点ではサンプルコードがありません。システムを適切にセットアップしたら、後でテストします。MsiEnableLog機能は、ファイルへのロギングを可能にする、関連の関数呼び出しです。更新:動作するSDKの例のようになります

で、コマンドラインインターフェイスレベル、あなたも追加して、ファイルに即座にそのバッファをフラッシュするロギングを設定することができますパラメータ:

msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log" 

つまり、ログファイルは継続的に書き込まれるため、msiexec.exeがクラッシュしてもログバッファーは失われません。IOオーバーヘッドのため、コストはインストーラーが大幅に遅くなります。


3

MsiExec はファイルにのみログを記録できるため、インストーラーの終了後もそのファイルの内容をエコーし​​続ける必要があります。


1

ローカルシステムのMSIログファイルを、インストールごとに共通の場所に永続的にキャッシュし、セットアップ全体の終了コードを登録するだけです。セットアップが成功を報告した場合、ログファイルはかなり興味深いものではありませんか?もっと「ノイズ」?

それ以外にも、MSIインストールのログ情報をキャプチャして一元的に保存するソフトウェア配信システムがいくつかあります。1つの例は、SCCM(MicrosoftがSystems Management Server-SMSに名前を変更した)です。

すべてのMSIファイルのログを設定するには、「マシン上のすべての設定に対してグローバルに」セクションを参照してください。http//www.installsite.org/pages/en/msifaq/a/1022.htm


0

次のPowerShellスクリプトを使用します。それでもログをファイルに書き込む必要がありますが、コンテンツをライブでstdoutに書き込みます。

$main_process = Start-Process -FilePath ".\installer.exe" -ArgumentList "/S /V`"/qn /l*! output.log`"" -NoNewWindow -PassThru
$log_process = Start-Process "powershell" "Get-Content -Path output.log -Wait" -NoNewWindow -PassThru
$main_process.WaitForExit()
$log_process.Kill()
exit $main_process.ExitCode
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.