我有以下Powershell代码,根据错误ID和消息计算每个Provider发生的错误数。我所追求的是获取每台计算机,日志,提供商,ID和级别的每个唯一消息的计数。
然而,我遇到的问题是,当我将此信息导出到.csv时,事件消息将被截断。或者更确切地说,我无法完全理解我需要做什么来获取整个事件消息。
以下是抓取事件日志并将其导出到.csv。
的代码$computername = 'mycomputer'
$logs = "application", "system"
$info = get-winevent -ComputerName $computername -FilterHashTable @{LogName=$logs; Level=1,2,3} |
sort MachineName,LogName,ProviderName,{$_.LevelDisplayName},ID |
Group MachineName, LogName, ProviderName, ID, {$_.LevelDisplayName}, Count, Message |
select @{N="Computer";E={$_.name.split(',')[0]}},@{N="Log";E={$_.name.split(',')[1]}}, @{N="Provider";E={$_.name.split(',')[2]}}, @{N="Error ID";E={$_.name.split(',')[3]}},`
@{N="Type";E={$_.name.split(',')[4]}}, count, @{N="Message";E={$_.name.split(',')[5 |
Export-Csv -notypeinformation -Path c:\Test\events.csv
如果我发表评论
#| Export-Csv -notypeinformation -Path c:\Test\events.csv
输出
$info
我看到了完整的信息。如果我继续扩展数组索引,我也可以看到更多的消息。例如,如果我这样做,我会收到更多信息:
, @{N="Message1";E={$_.name.split(',')[6]}}, @{N="Message2";E={$_.name.split(',')[7]}}
我需要编码正确以在
中输出整个消息@{N="Message";E={$_.name.split(',')[5]}}
选择
答案 0 :(得分:0)
我认为你可以采用更简单的方法,内置ConvertFrom-Csv
,脚本也会更容易读取
$info = get-winevent -ComputerName $computername -FilterHashTable @{LogName=$logs; Level=1,2,3} |
sort MachineName,LogName,ProviderName,{$_.LevelDisplayName},ID |
Group MachineName, LogName, ProviderName, ID, {$_.LevelDisplayName}, Count, Message
$Array = @()
$Header = "Computer","Log","Provider","ErrorID","Type","Message","Count"
Foreach ($item in $Info)
{
$Count = $Item.Count
$CSV = $item.Name | ConvertFrom-Csv -Delimiter "," -Header $Header
$CSV.Count = $Count
$Array += $CSV
}
$Array | Export-CSV C:\Test\Events.csv -NoTypeInformation
答案 1 :(得分:0)
我猜你没有截断。你刚刚收到包含逗号的消息,而Split()无法知道什么是分隔符以及消息的一部分。
好吧,我想你可以指明:
@{N="Message";E={($_.name.split(',')[5..($_.name.split(',').Count - 1)]) -join ','}}
但是,老实说,这感觉就像一些巨大的巨大箍跳过。
$_.Group[0].<item>
而不是$_.name.split(',')[<num>]
出了什么问题?除count
以外,您按照所有字段进行分组,不是吗?因此,根据定义,第一个事件的值应该与同一组中的每个其他事件相同,对吧?
另外,为什么{$_.LevelDisplayName}
而不仅仅是LevelDisplayName
?
我认为除非你删除换行符和回车符,否则你会发现Message在CSV中不会很好用。
试试这个:
$ComputerName = 'ComputerName';
$Logs = 'Application', 'System';
$Info = Get-WinEvent -ComputerName $ComputerName -FilterHashTable @{LogName=$Logs; Level=1,2,3} `
| Sort-Object MachineName, LogName, ProviderName, LevelDisplayName, ID `
| Group-Object MachineName, LogName, ProviderName, ID, LevelDisplayName, Count, Message `
| Select-Object @{N="Computer";E={$_.Group[0].MachineName}}, `
@{N="Log"; E={$_.Group[0].LogName}}, `
@{N="Provider";E={$_.Group[0].ProviderName}}, `
@{N="Error ID";E={$_.Group[0].ID}}, `
@{N="Type"; E={$_.Group[0].LevelDisplayName}}, `
count, `
@{N="Message"; E={$_.Group[0].Message.Replace("`r",' ').Replace("`n",' ')}} `
| Export-Csv -NoTypeInformation -Path c:\Test\events.csv;