Powershell Get-WinEvent截断消息

时间:2015-08-13 19:01:29

标签: powershell

我有以下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]}} 

选择

2 个答案:

答案 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;