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

Windows Powershell-将(默认显示)对象属性值从管道添加到字符串,windows,powershell,powershell-2.0,windows-server-2008-r2,event-log,Windows,Powershell,Powershell 2.0,Windows Server 2008 R2,Event Log,更新2:我在写这篇文章的时候发现了这一点。我想我会把它贴给其他蒙混过关的人。请参阅子标题“分辨率-仅获取默认属性”或答案。请随时用其他(尤其是更好的!)方法或评论作出回应 更新1:我一开始没有办法做到这一点,后来我找到了处理所有属性的方法。我把构建留给了其他像我一样困惑的人,但我当前的问题是我只想要默认的显示属性-请参阅子标题“获取所有属性” 假设我在powershell中有一个对象集合—我正在处理的特定示例是使用get-winevent cmdlet获取的事件集合 有人知道从管道中获取每个对象

更新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>
PS C:\>$events |%{“新记录”+($\.psobject.properties |%{$\.name;“:”;$\.value})
新记录消息:分配给新登录的特权。
主题:
安全ID:S-*-*-**-*********-**********-**********-*****
帐户名:**********
帐户域:**********
登录ID:0x**********
特权:SeSecurityPrivilege Id:4672版本:0限定符:
级别:0
然而,我现在正在提取一些数据使用者不需要的东西,因为我只需要默认属性及其名称,外加一个自定义分隔符

是否有人知道一种符号,它将返回所有默认显示属性的所有值,而不需要详细说明所述属性?要么是值的通用容器(例如$\ properties.value,尽管我尝试了,但没有成功),要么是像expand property之类的东西,而不需要指定特定的属性名

分辨率-仅获取默认属性

原来我想得太多了。FOREACH(%{})显然可以跨语句保留管道中的数据,因此如果使用两条语句,可以达到预期效果:

PS C:\> $events | format-list | %{"NEW RECORD" ; $_}
NEW RECORD
Message              : An account was successfully logged on.
<and etc>
PS C:\>$events |格式列表|%{“新记录”;$\u0}
新纪录
消息:已成功登录一个帐户。

我在写这篇文章时回答了这个问题,详细内容见上文。为了从对象及其值收集所有属性,并将它们作为字符串的一部分包括在内,请执行以下操作:

PS C:\> $events | %{"NEW RECORD" + ($_.psobject.properties | %{$_.name ; ":IMASTRING:" ; $_.value})}
PS C:\> $events | format-list | %{"NEW RECORD" ; $_}
上述方法在很大程度上要归功于Shay Levy的答案

要仅包括默认特性及其值(前面有字符串),请执行以下操作:

PS C:\> $events | %{"NEW RECORD" + ($_.psobject.properties | %{$_.name ; ":IMASTRING:" ; $_.value})}
PS C:\> $events | format-list | %{"NEW RECORD" ; $_}
要包含所有属性及其值(前面有字符串,但保留默认格式),请执行以下操作:

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

我认为你做的事情很简单,也许对你的处境来说是最好的方式。实际上,有一种方法可以知道默认属性的名称

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
这是我在上面找到这些信息的帖子