【发布时间】:2014-11-06 10:40:08
【问题描述】:
更新 2:我最终在编写它时弄清楚了这一点。我想我会把它贴出来给其他蒙混过关的人。请参阅子标题“解决方案 - 仅获取默认属性”或答案。请随时使用替代(尤其是更好!)方法或 cmets 做出回应。
更新 1:我一开始没有办法做到这一点,后来我找到了适用于所有属性的方法。我已经为其他人和我一样困惑的人留下了积累,但我目前的问题是我只想要默认的显示属性 - 请参阅子标题“获取所有属性”
假设我在 powershell 中有一个对象集合 - 我正在使用的具体示例是使用 get-winevent cmdlet 获取的事件集合。
有没有人知道一种优雅的方法来从管道中获取每个对象的所有(默认)属性的值,并将它们添加到字符串的末尾?尤其是一种不需要知道您想要哪些属性的方式。
例如,使用包含一些事件日志条目的变量 $events,如果我简单地调用 $events,powershell 将对我想要的属性做出一些假设并将它们格式化为列表:
PS C:\> $events
TimeCreated ProviderName Id Message
----------- ------------ -- -------
11/09/2014 3:59:... Microsoft-Window... 4634 An account was l...
11/09/2014 3:58:... Microsoft-Window... 4634 An account was l...
但是,如果我尝试在返回的条目之前加上一个字符串,我会得到属性名称而不是值:
PS C:\> $events | %{"NEW RECORD" + $_}
NEW RECORDSystem.Diagnostics.Eventing.Reader.EventLogRecord
NEW RECORDSystem.Diagnostics.Eventing.Reader.EventLogRecord
PS C:\> $events | %{"NEW RECORD" + $_.properties}
NEW RECORDSystem.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.E
venting.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty S
ystem.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Rea
der.EventProperty
我能想到的最简单的解决方法是使用(因此知道)属性值,并且还丢失了 format-table 或 format-list 将提供的符号:
PS C:\> $events | %{"NEW RECORD - TimeCreated: " + $_.TimeCreated + "; ProviderName: "`
+ $_.ProviderName + "; ID: " + $_.ID + "; Message: " + $_.message}
NEW RECORD - TimeCreated: 09/11/2014 15:58:08; ProviderName: Microsoft-Windows-
Security-Auditing; ID: 4672; Message: Special privileges assigned to new logon.
Subject:
Security ID: S-*-*-**-*********-**********-**********-*****
Account Name: **********
Account Domain: **********
Logon ID: 0x**********
Privileges: SeSecurityPrivilege
获取所有属性
所以我发现我可以获得所有属性及其名称,如下所示:
PS C:\> $events | %{"NEW RECORD" + ($_.psobject.properties | %{$_.name ; ":" ; $_.value})}
NEW RECORDMessage : Special privileges assigned to new logon.
Subject:
Security ID: S-*-*-**-*********-**********-**********-*****
Account Name: **********
Account Domain: **********
Logon ID: 0x**********
Privileges: SeSecurityPrivilege Id : 4672 Version : 0 Qualifiers :
Level : 0 <and so on>
但是,我现在提取了一堆我的数据消费者不需要的东西,因为我只需要默认属性和它们的名称,加上一个自定义的分隔符。
是否有人知道将返回所有默认显示属性的所有值而无需拼写所述属性的表示法?值的通用容器(例如 $_.properties.value,尽管我尝试过但它没有用),或者类似 expand-property 之类的东西,不需要指定特定的属性名称?
解决方案 - 仅获取默认属性
所以事实证明我想多了。 FOREACH (%{}) 显然可以跨语句保存管道中的数据,所以如果我使用两个语句就可以达到预期的效果:
PS C:\> $events | format-list | %{"NEW RECORD" ; $_}
NEW RECORD
Message : An account was successfully logged on.
<and etc>
【问题讨论】:
标签: windows powershell powershell-2.0 windows-server-2008-r2 event-log