任务: 将管道数据从对象写入事件日志:
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.exe
(isel -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
不接受管道。
目的不是使用循环。
答案 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