Existe alguma maneira de obter msiexec para eco para stdout em vez de fazer logon em um arquivo

8

Como parte de um pipeline de entrega contínua, eu gostaria de instalar um msi em uma determinada máquina. O msiexec e o psexec fazem isso perfeitamente, mas parece que o msiexec só pode fazer logon em um arquivo e eu preciso que ele faça o log no stdout / stderr.

No momento, para recuperar a saída do software de CI, terei que adicionar uma segunda etapa para ecoar o conteúdo do log, o que parece um pouco inútil.

Alguém já enfrentou esse problema antes (e superou?)

Agradecemos antecipadamente por qualquer ajuda aqui.

Marca

mrmrcoleman
fonte
Use o registro de arquivos embutido do msiexec e leia novamente a partir do disco. Vários processos msiexec.exe podem ser iniciados durante a instalação, e acho que seria difícil redirecionar a saída de todos eles. Você pode ver processos msiexec.exe gerados automaticamente em execução em diferentes contextos de segurança e também para executar ações personalizadas. Uma lata de vermes que eu diria para lidar.
Stein Åsmul

Respostas:

5

Eu verifiquei isso novamente, e aqui estão algumas informações atualizadas :

É possível suprimir a GUI da MSI e definir uma GUI externa implementada por terceiros. Essa GUI externa pode receber mensagens do msiexec.exe enquanto executa a instalação. Isso é principalmente para implementar uma barra de progresso personalizada , mas parece que você também pode interceptar a maioria das outras mensagens de erro e status: Função MsiSetExternalUI .

O parâmetro interessante é o dwMessageFilter . Ao definir isso, você pode, por exemplo, receber apenas as mensagens de erro que ocorrem durante a instalação - ou assim parece. Suponho que isso possa ser suficiente para a maioria dos propósitos.

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

Lamentavelmente, não tenho código de amostra para isso no momento. Vou testar isso mais tarde, quando eu configurar meu sistema corretamente. A função MsiEnableLog é uma chamada de função relacionada que permitirá o log do arquivo. Atualização: Aqui está o que parece um exemplo de SDK em funcionamento .

No nível da interface da linha de comandos , você também pode configurar o log para liberar seu buffer imediatamente para arquivar, adicionando o ! parâmetro:

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

Isso significa que o arquivo de log é gravado continuamente, para que nenhum buffer de log seja perdido se o msiexec.exe travar. O custo é de um instalador significativamente mais lento devido à sobrecarga de E / S.

Stein Åsmul
fonte
3

MsiExec só pode fazer logon em um arquivo; portanto, você terá que repetir o conteúdo desse arquivo após a conclusão do instalador.

Ansgar Wiechers
fonte
1

Eu preferiria armazenar em cache o arquivo de log MSI no sistema local permanentemente em um local comum para cada instalação e depois apenas registrar o código de saída de toda a instalação. Se a instalação relatar êxito, o arquivo de log será bastante desinteressante? Apenas mais "barulho"?

Além disso, existem vários sistemas de entrega de software que capturam as informações de log para uma instalação MSI e as armazenam centralmente. Um exemplo é o SCCM (Microsofts renomeado para Systems Management Server - SMS).

Configurando o log para todos os arquivos MSI, consulte a seção "Globalmente para todas as configurações em uma máquina": http://www.installsite.org/pages/en/msifaq/a/1022.htm

Stein Åsmul
fonte
0

Eu uso o seguinte script do PowerShell. Ele ainda requer gravar o log em um arquivo, mas também grava o conteúdo ao vivo no 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
fonte