Piping mensagens do powershell para Write-EventLog

4

Eu tenho um script powershell que executa um cmdlet personalizado. É executado pelo Agendador de Tarefas e quero registrar o que ele faz.

Esta é a minha versão atual:

Add-PsSnapIn MyCmdlets
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message "Starting Update-ClubNumbers" -EventId 0
Get-ClubMembers -HasTemporaryNumber -show all | Update-ClubNumbers -Verbose
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message "Finished Update-ClubNumbers" -EventId 0

O que eu gostaria de fazer é registrar a saída do meu cmdlet personalizado. Idealmente, gostaria de criar diferentes tipos de entradas de log de eventos com base em se era um aviso ou uma mensagem detalhada.

Atualização: não quero registrar o valor de retorno do commandlet. O cmdlet Update-ClubMembers não retorna um objeto. Eu quero registrar qualquer mensagem detalhada escrita por WriteVerbose e eu quero registrar erros criados por ThrowTerminatingError.

    
por Richard 23.06.2011 / 13:13

2 respostas

1

Que tipo de dados o cmdlet retorna? Você pode salvá-lo em uma string como essa,

$ret = Get-ClubMembers -Whatever...
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $ret -EventId 0

Se os dados retornados forem uma matriz, você deverá criar uma string comum primeiro. De outra forma, a mensagem de log conterá apenas o nome da matriz. Talvez algo parecido com isto

$ret = Get-ClubMembers -Whatever...
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $($ret -join [Environment]::NewLine) -EventId 0

Ed:

Tanto quanto eu sei - e eu realmente gostaria de estar errado neste - você se deparou com um desagradável limitação do Powershell. O blog de Keith Hill tem uma espécie de contornar . Você mencionou que o cmdlet é personalizado. Talvez você possa pedir ao desenvolvedor para adicionar um switcht que alterna as mensagens para stdout, para que a execução do cmdlet retorne sua saída como uma matriz de strings facilmente registrada.

    
por 27.06.2011 / 11:38
0

Como apontado por vonPryz, parece não haver nenhuma maneira de capturar mensagens detalhadas a partir de um cmdlet, no entanto, ThrowTerminatingError lança uma exceção e descobri que você pode capturá-las e registrar o erro da seguinte forma:

try
{
    Get-ClubMembers -HasTemporaryEbuNumber -show all | Update-EbuNumbers
}
catch [System.Exception]
{
    Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $_.Exception.ToString() -EventId 0 -EntryType Error
}
    
por 28.06.2011 / 10:56