Write-Eventlog管道问题

时间:2016-03-07 16:54:02

标签: powershell event-log

任务: 将管道数据从对象写入事件日志:

RecId|Date/Time|Sev|Src|EvtType|Sensor|EvtDetail
0001|01/01/1600:00:00|INF|BMC|Eventlog|SELFullness|LogCleared
0002|01/01/1600:00:01|MAJ|BMC|Eventlog|Progress|PostError
0003|01/01/1600:00:02|INF|BMC|PowerUnit|HostPower|PowerOff
0004|01/01/1600:00:03|MAJ|BMC|SystemFirmware|SELFullness|PostError
0005|01/01/1600:00:04|INF|BMC|OsBoot||C:bootcompleted

这个小CSV存储在D:\ Powershell \ Bmc.log中几乎是服务器上ipmitool.exeisel -c)的解析输出。

$raw = Get-Content .\Bmc.log
$sel = ConvertFrom-CSV -InputObject $raw -Delimiter "|"
$sel | Where-Object {$_.Sev -eq "INF"} | Out-GridView

这很有效,我可以使用$sel作为对象,可以列出其成员等。 现在我想将所有记录转储到eventlog,但它不起作用。 我的方法:

New-Eventlog -LogName HardwareEvents -Source BMC
$sel | Where-Object {$_.Sev -eq "INF"} | Write-Eventlog -LogName HardwareEvents -Source BMC -EventId 999 -Message {$_.EvtDetail} -EntryType INFORMATION

似乎Write-Eventlog不接受管道。 目的不是使用循环。

1 个答案:

答案 0 :(得分:1)

正如您所怀疑和其他人指出的那样,Write-EventLog没有从管道中读取。用ForEach-Object语句包装它:

$sel | Where-Object {$_.Sev -eq "INF"} | ForEach-Object {
  Write-EventLog -LogName HardwareEvents -Source BMC -EventId 999 -Message $_.EvtDetail -EntryType INFORMATION
}

否则,您需要将Write-EventLog包装在一个处理管道输入的自定义函数中:

function Write-EventLogMessage {
  [CmdletBinding()]
  Param(
    [Parameter(
      Mandatory=$true,
      Position=0
      ValueFromPipeline=$true,
      ValueFromPipelineByPropertyName=$true
    )]
    [string]$Message
  )

  Process {
    Write-EventLog -LogName HardwareEvents -Source BMC -EventId 999 -Message $Message -EntryType INFORMATION
  }
}

$sel | Where-Object {$_.Sev -eq "INF"} | Write-EventLogMessage