Apakah ada pula untuk mendapatkan msiexec untuk menggema ke stdout alih-alih masuk ke file

8

Sebagai bagian dari pipa pengiriman kontinu, saya ingin memasang msi pada mesin yang diberikan. msiexec plus psexec melakukan ini dengan sempurna, tetapi tampaknya msiexec hanya dapat masuk ke file dan saya membutuhkannya untuk masuk ke stdout / stderr.

Saat ini, untuk mendapatkan output kembali ke perangkat lunak CI kami, saya harus menambahkan langkah kedua untuk menggemakan isi log, yang tampaknya agak sia-sia.

Adakah yang pernah mengalami masalah ini sebelumnya (dan mengatasinya?)

Terima kasih sebelumnya atas bantuan apa pun di sini.

Menandai

mrmrcoleman
sumber
Gunakan file logging bawaan msiexec, dan baca kembali dari disk. Beberapa proses msiexec.exe dapat diluncurkan selama instalasi, dan saya pikir Anda akan sulit sekali untuk mengarahkan ulang output dari semuanya. Anda mungkin melihat proses msiexec.exe yang dijalankan secara otomatis berjalan dalam konteks keamanan yang berbeda dan juga untuk menjalankan tindakan kustom. Satu kaleng cacing yang akan kukatakan untuk ditangani.
Stein Åsmul

Jawaban:

5

Saya memeriksanya lagi, dan ini beberapa informasi terbaru :

Dimungkinkan untuk menekan GUI MSI dan menetapkan GUI eksternal yang diterapkan oleh pihak ketiga. GUI eksternal ini dapat menerima pesan dari msiexec.exe saat melakukan instalasi. Ini sebagian besar untuk menerapkan bilah kemajuan kustom , tetapi tampaknya Anda juga dapat mencegat sebagian besar pesan kesalahan dan pesan status lainnya: Fungsi MsiSetExternalUI .

Parameter yang menarik adalah dwMessageFilter . Dengan mengatur ini, Anda dapat, misalnya, hanya menerima pesan kesalahan yang terjadi selama instalasi - atau begitulah tampaknya. Saya kira ini cukup untuk sebagian besar tujuan.

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

Sayangnya saya tidak memiliki kode contoh untuk saat ini. Saya akan menguji ini nanti, ketika saya mengatur sistem saya dengan benar. Fungsi MsiEnableLog adalah panggilan fungsi terkait yang akan memungkinkan logging ke file. Pembaruan: Ini adalah contoh SDK yang berfungsi .

Pada tingkat antarmuka baris perintah , Anda juga dapat mengatur logging untuk menyiram buffernya segera ke file dengan menambahkan ! parameter:

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

Ini berarti file log ditulis terus menerus sehingga tidak ada buffer log yang hilang jika msiexec.exe macet. Biaya pemasangannya jauh lebih lambat karena overhead IO.

Stein Åsmul
sumber
3

MsiExec hanya dapat masuk ke file, jadi Anda harus terus menggema konten file itu setelah installer selesai.

Ansgar Wiechers
sumber
1

Saya lebih suka cache file log MSI pada sistem lokal secara permanen di lokasi umum untuk setiap instalasi, dan kemudian hanya mendaftarkan kode keluar dari seluruh pengaturan. Jika pengaturan melaporkan keberhasilan, file log cukup menarik? Hanya lebih banyak "kebisingan"?

Selain itu ada beberapa sistem pengiriman perangkat lunak yang akan menangkap informasi log untuk menginstal MSI dan menyimpannya secara terpusat. Salah satu contoh adalah SCCM (Microsoft mengubah nama Server Manajemen Sistem - SMS).

Menyiapkan pencatatan untuk semua file MSI, lihat bagian "Secara global untuk semua penyetelan pada mesin": http://www.installsite.org/pages/en/msifaq/a/1022.htm

Stein Åsmul
sumber
0

Saya menggunakan skrip PowerShell berikut. Itu masih membutuhkan menulis log ke file tetapi juga menulis konten langsung ke 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
inkychris
sumber