【问题标题】:Powershell - Add (default display) object property values from pipe to stringPowershell - 将(默认显示)对象属性值从管道添加到字符串
【发布时间】: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


    【解决方案1】:

    我在写的时候回答了这个问题,细节在上面。为了收集对象的所有属性及其值,并将两者都包含为字符串的一部分:

    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"; $_}
    

    【讨论】:

      【解决方案2】:

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

      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 上找到此信息的帖子。

      【讨论】:

        猜你喜欢
        • 2019-04-09
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 2023-04-06
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多