Powershell - 从管道到字符串添加(默认显示)对象属性值

时间:2014-09-12 09:31:15

标签: windows powershell powershell-v2.0 windows-server-2008-r2 event-log

更新2 :我在写这篇文章的时候最终搞清楚了。我想我会把它贴在其他任何混淆的人身上。请参阅子标题“分辨率 - 仅获取默认属性”或答案。请随意回复(特别是更好!)方法或评论。

更新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>

2 个答案:

答案 0 :(得分:0)

我在写这篇文章时回答了这个问题,详情如上。为了从对象及其值中收集所有属性,并将它们作为字符串的一部分包含在内:

PS C:\> $events | %{"NEW RECORD" + ($_.psobject.properties | %{$_.name ; ":IMASTRING:" ; $_.value})}

上述方法很大程度上归功于Shay Levy对this question的回答。

仅包含默认属性及其值,前面带有字符串:

PS C:\> $events | format-list | %{"NEW RECORD" ; $_}

要包含所有属性及其值,前面有字符串但保留默认格式:

PS C:\> $events | select-object * | format-list | %{"NEW RECORD"; $_}

答案 1 :(得分:0)

我认为您已经为您的情况做了简单而且可能最好的方式。实际上有一种方法可以知道默认属性的名称

PS Scripts:\> $x = gwmi -Class win32_operatingsystem
PS Scripts:\> $x.psstandardmembers
PSStandardMembers {DefaultDisplayPropertySet}
PS Scripts:\> $x.psstandardmembers.DefaultDisplayPropertySet


ReferencedPropertyNames : {SystemDirectory, Organization, BuildNumber, RegisteredUser...}
MemberType              : PropertySet
Value                   : DefaultDisplayPropertySet {SystemDirectory, Organization, BuildNumber, RegisteredUser,
                          SerialNumber, Version}
TypeNameOfValue         : System.Management.Automation.PSPropertySet
Name                    : DefaultDisplayPropertySet
IsInstance              : False



PS Scripts:\> $x.psstandardmembers.DefaultDisplayPropertySet.ReferencedPropertyNames
SystemDirectory
Organization
BuildNumber
RegisteredUser
SerialNumber
Version

这是我在PSStandard Members上找到此信息的帖子。