Esiste comunque un modo per far sì che msiexec faccia eco a stdout invece di accedere a un file


8

Come parte di una pipeline a consegna continua, vorrei installare un MSI su una determinata macchina. msiexec plus psexec lo fa perfettamente, ma sembra che msiexec possa accedere solo a un file e ne ho bisogno per accedere a stdout / stderr.

In questo momento, per ripristinare l'output nel nostro software CI, dovrò aggiungere un secondo passaggio per riecheggiare il contenuto del registro, che sembra un po 'inutile.

Qualcuno ha già affrontato questo problema (e superato?)

Grazie in anticipo per qualsiasi aiuto qui.

marchio


Utilizzare la registrazione file integrata di msiexec e rileggere dal disco. Diversi processi msiexec.exe possono essere avviati durante l'installazione e penso che sarebbe difficile trovare il reindirizzamento dell'output di tutti. È possibile che vengano visualizzati processi msiexec.exe generati automaticamente in esecuzione in contesti di sicurezza diversi e anche per eseguire azioni personalizzate. Una lattina di vermi che direi di affrontare.
Stein Åsmul,

Risposte:


5

Ho controllato di nuovo questo, ed ecco alcune informazioni aggiornate :

È possibile sopprimere la GUI MSI e impostare una GUI esterna implementata da una terza parte. Questa GUI esterna è in grado di ricevere messaggi da msiexec.exe mentre esegue l'installazione. Questo è principalmente per implementare una barra di avanzamento personalizzata , ma sembra che tu possa anche intercettare la maggior parte degli altri messaggi di errore e messaggi di stato: funzione MsiSetExternalUI .

Il parametro interessante è dwMessageFilter . Impostando questo è possibile, ad esempio, ricevere solo i messaggi di errore che si verificano durante l'installazione - o così sembrerebbe. Suppongo che questo possa essere sufficiente per la maggior parte degli scopi.

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

Purtroppo al momento non ho un codice di esempio per questo. Lo proverò più tardi, quando avrò configurato correttamente il mio sistema. La funzione MsiEnableLog è una chiamata di funzione correlata che abilita la registrazione su file. Aggiornamento: ecco come appare un esempio di SDK funzionante .

A livello di interfaccia della riga di comando , è anche possibile impostare la registrazione per scaricare immediatamente il suo buffer nel file aggiungendo il ! parametro:

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

Ciò significa che il file di registro viene scritto continuamente, quindi nessun buffer di registro viene perso in caso di arresto anomalo di msiexec.exe. Il costo è un installatore significativamente più lento a causa dell'overhead IO.


3

MsiExec puoi solo accedere a un file, quindi dovrai continuare a ripetere il contenuto di quel file dopo che l'installazione è terminata.


1

Preferirei memorizzare il file di registro MSI sul sistema locale in modo permanente in una posizione comune per ogni installazione, quindi registrare semplicemente il codice di uscita dell'intera configurazione. Se l'installazione segnala il successo, il file di registro non è interessante? Solo più "rumore"?

Oltre a ciò, esistono diversi sistemi di consegna del software che acquisiranno le informazioni del registro per un'installazione MSI e le memorizzeranno centralmente. Un esempio è SCCM (Microsofts rinominato Systems Management Server - SMS).

Impostazione della registrazione per tutti i file MSI, vedere la sezione "A livello globale per tutte le impostazioni su una macchina": http://www.installsite.org/pages/en/msifaq/a/1022.htm


0

Uso il seguente script PowerShell. Richiede ancora la scrittura del registro in un file ma scrive anche i contenuti live su 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.