我有以下Powershell代码,它根据错误ID和消息统计每个提供程序发生的错误数。我所追求的是获得每台计算机,日志,提供商,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]}} 选择?
发布于 2015-08-14 04:25:03
我认为您可以采用一种更简单的方法,使用内置的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 发布于 2015-08-14 04:26:24
我猜你不是在截断。您只得到了带有逗号的消息,而Split()无法知道什么是分隔符,什么是消息的一部分。
好吧,我想你可以指定:
@{N="Message";E={($_.name.split(',')[5..($_.name.split(',').Count - 1)]) -join ','}}但是,老实说,这感觉像是要跳过一些巨大的圈圈。
用$_.Group[0].<item>而不是$_.name.split(',')[<num>]有什么问题?除了count,你是按你拉出的所有字段分组的,不是吗?因此,根据定义,第一个事件的值应该与同一组中其他所有事件的值相同,对吗?
另外,为什么不仅仅是LevelDisplayName,而是{$_.LevelDisplayName}
我想你会发现,除非去掉换行符和回车符,否则消息在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;https://stackoverflow.com/questions/31996380
复制相似问题