web-dev-qa-db-ja.com

PowerShellメッセージをWrite-EventLogにパイプする

カスタムコマンドレットを実行するPowerShellスクリプトがあります。これはタスクスケジューラによって実行され、その動作をログに記録したいと思います。

これは私の現在の原油バージョンです:

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

私がやりたいのは、カスタムコマンドレットの出力をログに記録することです。理想的には、警告メッセージか詳細メッセージかに基づいて、さまざまな種類のイベントログエントリを作成したいと思います。

更新:コマンドレットの戻り値をログに記録したくありません。 Update-ClubMembersコマンドレットはオブジェクトを返しません。 WriteVerboseによって書き込まれた詳細メッセージをログに記録し、ThrowTerminationErrorによって作成されたエラーをログに記録したいと思います。

4
Richard

コマンドレットはどのような種類のデータを返しますか?あなたはそれをそのような文字列に保存することができます、

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

返されるデータが配列の場合は、最初に通常の文字列を作成する必要があります。それ以外の場合、ログメッセージにはアレイ名のみが含まれます。多分このようなもの

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

エド:

私の知る限り、これは本当に間違っていると思いますが、Powershellの 厄介な制限 に遭遇しました。キースヒルのブログには、ある種の 回避策 があります。コマンドレットはカスタムのものであるとおっしゃいました。たぶん、開発者にメッセージをstdoutに切り替えるswitchtを追加するように依頼して、コマンドレットを実行すると、出力が簡単にログに記録される文字列配列として返されるようにすることができます。

1
vonPryz

VonPryzが指摘しているように、コマンドレットから詳細メッセージをキャプチャする方法はないようですが、ThrowTerminationErrorは例外をスローし、それらをキャプチャして次のようにエラーをログに記録できることがわかりました。

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
}
0
Richard