Există vreo modalitate de a obține msiexec pentru a ecou la stdout în loc de jurnalizare la un fișier (Administrarea sistemului, Logare, Stdout, Stderr, Msi)

mrmrcoleman a intrebat.

Ca parte a unei conducte de livrare continuă, aș dori să instalez un msi pe o anumită mașină. msiexec plus psexec face acest lucru perfect, dar se pare că msiexec poate doar să se înregistreze într-un fișier și am nevoie ca acesta să se înregistreze în stdout/stderr.

În momentul de față, pentru a obține ieșirea înapoi în software-ul nostru CI, va trebui să adaug un al doilea pas pentru a reda conținutul jurnalului, ceea ce pare puțin inutil.

S-a mai confruntat cineva cu această problemă (și a depășit-o?)

Mulțumesc în avans pentru orice ajutor aici.

Mark

Comentarii

  • Folosiți jurnalul de fișiere încorporat de msiexec și citiți înapoi de pe disc. În timpul instalării pot fi lansate mai multe procese msiexec.exe și cred că v-ar fi greu să redirecționați ieșirea tuturor. Este posibil să vedeți procese msiexec.exe lansate automat care rulează în diferite contexte de securitate și, de asemenea, pentru a executa acțiuni personalizate. O cutie de viermi cu care aș spune că trebuie să vă ocupați. –  > Por Stein Åsmul.
4 răspunsuri
Stein Åsmul

Am verificat din nou acest lucru și iată câteva informații actualizate:

Este posibilă suprimarea interfeței grafice MSI și setarea unei GUI externă implementată de o terță parte. Această GUI externă este capabilă să primească mesaje de la msiexec.exe în timp ce efectuează instalarea. Acest lucru este în principal pentru a implementa un bară de progres personalizată, , dar se pare că se pot intercepta și majoritatea celorlalte mesaje de eroare și mesaje de stare: Funcția MsiSetExternalUI.

Parametrul interesant este dwMessageFilter. Prin setarea acestuia puteți, de exemplu, să primiți doar mesajele de eroare care apar în timpul instalării – sau cel puțin așa pare. Presupun că acest lucru poate fi suficient pentru majoritatea scopurilor.

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

Din păcate, în acest moment nu am un cod de exemplu pentru acest lucru. Voi testa acest lucru mai târziu, când voi avea sistemul configurat corespunzător. Site-ul Funcția MsiEnableLog este un apel de funcție conexă care va activa înregistrarea în fișier. Actualizare: Iată ceea ce pare a fi un exemplu SDK funcțional..

La nivelul interfeței de linie de comandă, puteți, de asemenea, să setați jurnalizarea pentru a spăla imediat memoria tampon în fișier prin adăugarea instrucțiunii ! :

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

Acest lucru înseamnă că fișierul de jurnal este scris continuu, astfel încât nu se pierde niciun buffer de jurnal dacă msiexec.exe se blochează. Costul este un program de instalare semnificativ mai lent din cauza costurilor IO.

Ansgar Wiechers

MsiExec nu poate înregistra decât într-un fișier, deci va trebui să continuați să recitiți conținutul acelui fișier după terminarea programului de instalare.

Stein Åsmul

Aș prefera mai degrabă să memorez permanent fișierul jurnal MSI pe sistemul local, într-o locație comună pentru fiecare instalare, și apoi să înregistrez doar codul de ieșire al întregii instalări. Dacă instalarea raportează succes, fișierul jurnal este destul de neinteresant? Doar mai mult „zgomot”?

În afară de aceasta, există mai multe sisteme de livrare de software care captează informațiile de jurnal pentru o instalare MSI și le stochează la nivel central. Un exemplu este SCCM (Microsofts redenumit Systems Management Server – SMS).

Configurarea jurnalizării pentru toate fișierele MSI, consultați secțiunea „Global pentru toate instalările de pe o mașină”: http://www.installsite.org/pages/en/msifaq/a/1022.htm

inkychris

Eu folosesc următorul script powershell. Acesta necesită în continuare scrierea jurnalului într-un fișier, dar scrie și conținutul în direct pe 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