首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell Get-WinEvent截断消息

Powershell Get-WinEvent截断消息
EN

Stack Overflow用户
提问于 2015-08-14 03:01:29
回答 2查看 1.7K关注 0票数 0

我有以下Powershell代码,它根据错误ID和消息统计每个提供程序发生的错误数。我所追求的是获得每台计算机,日志,提供商,id和级别的每一个独特的消息的计数。

但是,我遇到的问题是,当我将此信息导出到.csv时,事件消息会被截断。或者更确切地说,我不能很好地掌握我需要做什么才能获得整个事件消息。

下面是获取事件日志并将其导出到.csv的代码。

代码语言:javascript
复制
$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

如果我注释掉

代码语言:javascript
复制
#| Export-Csv -notypeinformation -Path c:\Test\events.csv

和输出

代码语言:javascript
复制
$info

我看到了完整的消息。如果我继续展开数组索引,我还可以看到更多的消息。例如,如果我这样做,我会得到更多的消息:

代码语言:javascript
复制
, @{N="Message1";E={$_.name.split(',')[6]}}, @{N="Message2";E={$_.name.split(',')[7]}}

我需要什么代码才能使整个消息在

代码语言:javascript
复制
@{N="Message";E={$_.name.split(',')[5]}} 

选择?

EN

回答 2

Stack Overflow用户

发布于 2015-08-14 04:25:03

我认为您可以采用一种更简单的方法,使用内置的ConvertFrom-Csv,脚本也会更具可读性

代码语言:javascript
复制
$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 
票数 0
EN

Stack Overflow用户

发布于 2015-08-14 04:26:24

我猜你不是在截断。您只得到了带有逗号的消息,而Split()无法知道什么是分隔符,什么是消息的一部分。

好吧,我想你可以指定:

代码语言:javascript
复制
@{N="Message";E={($_.name.split(',')[5..($_.name.split(',').Count - 1)]) -join ','}}

但是,老实说,这感觉像是要跳过一些巨大的圈圈。

$_.Group[0].<item>而不是$_.name.split(',')[<num>]有什么问题?除了count,你是按你拉出的所有字段分组的,不是吗?因此,根据定义,第一个事件的值应该与同一组中其他所有事件的值相同,对吗?

另外,为什么不仅仅是LevelDisplayName,而是{$_.LevelDisplayName}

我想你会发现,除非去掉换行符和回车符,否则消息在CSV中不能很好地工作。

试试这个:

代码语言:javascript
复制
$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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31996380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档