Piping powershell messages à Write-EventLog

J'ai un script powershell qui exécute une cmdlet personnalisée. Il est géré par Task Scheduler et je veux save ce qu'il fait.

Voici ma version actuelle:

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 

Ce que j'aimerais faire, c'est de consigner la sortie de ma cmdlet personnalisée. Idéalement, j'aimerais créer différents types d'inputs de journal des events en fonction de l'avertissement ou d'un message détaillé.

Mise à jour: je ne souhaite pas save la valeur de return de la command. La cmdlet Update-ClubMembers ne renvoie aucun object. Je veux save tous les messages détaillés écrits par WriteVerbose et je veux save les erreurs créées par ThrowTerminatingError.

Quel type de données la rampe de command est-elle revenue? Vous pouvez l'save dans une string comme ça,

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

Si datatables renvoyées sont un tableau, vous devez d'abord créer une string ordinaire. Othervise, le message de journal contient simplement le nom du tableau. Peut-être quelque chose comme ça

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

Ed:

Pour autant que je sache – et j'aimerais vraiment avoir tort dans celui-ci – vous avez rencontré une mauvaise limitation de Powershell. Le blog de Keith Hill est un bon travail . Vous avez mentionné que la cmdlet est personnalisée. Peut-être que vous pourriez requestr à son développeur d'append un switcht qui bascule les messages vers Stdout, de sorte que l'exécution de la cmdlet renverrait sa sortie en tant que string de connection facilement enregistrée.

Comme l'a souligné vonPryz, il semble qu'il n'y ait aucun moyen de capturer des messages détaillés à partir d'une cmdlet, mais ThrowTerminatingError jette une exception et j'ai constaté que vous pouvez les capturer et save l'erreur comme ceci:

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