3

例如,查看进程线程会显示如下内容:

PS C:\> (Get-Process)[0] | Format-List -Property Threads

Threads : {1548, 1600, 15940, 13996}

但如果你真的直接获取该属性,它看起来像这样:

PS C:\> (Get-Process)[0].Threads

BasePriority            : 8
CurrentPriority         : 9
Id                      : 1548
IdealProcessor          : 
PriorityBoostEnabled    : 
PriorityLevel           : 
PrivilegedProcessorTime : 
StartAddress            : 8790537024736
StartTime               : 
ThreadState             : Wait
TotalProcessorTime      : 
UserProcessorTime       : 
WaitReason              : UserRequest
ProcessorAffinity       : 
Site                    : 
Container               : 

BasePriority            : 8
... etc

格式列表显然有一种智能汇总对象的方法。它获取一个对象列表,从每个对象中提取一个具有代表性的属性,并将其显示为一个短数组。我找不到允许我以相同方式汇总对象集合的方法或 cmdlet。

我希望能够将任意对象集合传递给方法并对其进行汇总。这用于在 Exchange 对象中列出电子邮件地址、在 AD 对象中列出组以及许多其他地方......我怀疑这些都是特殊情况。


扩展(在从@JoelSmith 的评论中了解更多信息之后):

.NET 对象具有Powershell 在格式化输出时使用的格式化定义使用[1]可获得更多详细信息。这些定义是通用的,可以通过任何命令访问,但默认情况下,Powershell 中没有函数可以直接检索对象属性的输出,因为它将显示在 Format-List 中。help about_Format.ps1xml

一种骇人听闻的解决方法是像这样拆分和剥离输出:

(Get-Mailbox user | Format-List -Property Languages | Out-String).Split(':')[1].Trim()
    # => {en-US,fr-CA}

然而,这种方法非常脆弱,当输出跨越多行或在输出中包含冒号时会失败:

(Get-Mailbox user | Format-List -Property EmailAddresses | Out-String).Split(':')[1].Trim()
    # => {smtp

所需要的是一种读取为对象定义的格式定义并直接检索它,然后使用它来输出所需字符串的方法。我没有在网上找到任何例子。

4

4 回答 4

1

通常 .ToString() 有效,但有时他们忘记实现该方法。

 (Get-Process)[0] | %{$_.Threads.Id}

编辑:在下面回答您的评论

(Get-Process)[0] | Format-List -Property Threads | Out-String

不幸的是,并非所有 cmdlet 都相同。

于 2013-06-12T20:00:17.793 回答
1

你在寻找这样的东西吗?

(Get-Process)[0].Threads | Format-Table -Property ID -AutoSize

   Id
   --
13060
13064
13068
13072
13076
13080
13084

这需要根据输出内容和您需要的字段为每个 cmdlet 进行自定义。它不起作用的原因只是(Get-Process)[0] | Format-Table -Property Threads -AutoSize因为Threads返回线程对象,并且对象数组像您的第一个示例一样显示(集合中对象的字符串表示{ .. })。

于 2013-06-12T21:08:22.617 回答
1

到目前为止,这是我能说的:

Id 属性是线程对象 (System.Diagnostics.ProcessThread) 的默认显示属性。我在任何 PowerShell 的类型文件中都找不到任何轨道,但我可以更改 Format-* 显示线程的方式(需要 PowerShell 3.0)。

默认情况下,格式 cmdlet 会打印每个线程对象的 Id 值:

Threads : {1548, 1600, 15940, 13996}

格式化 cmdlet 检查$FormatEnumerationLimit变量的值(默认值为 4)来决定如何格式化对象。如果结果是一个对象(标量),它将打印为:

Threads : 1548

如果它是项目的集合并且集合计数达到$FormatEnumerationLimit(4) 的值,它将显示为:

Threads : {1548, 1600, 15940, 13996}

大于$FormatEnumerationLimit将看起来像的计数(... 表示有更多对象):

Threads : {1548, 1600, 15940, 13996...}

我可以告诉 Id 是正在使用的默认属性,因为我可以将其更改为另一个属性并查看其值反映在输出中。例如,这里我将 ThreadState 设置为默认显示属性:

PS> Update-TypeData -TypeName System.Diagnostics.ProcessThread -DefaultDisplayProperty ThreadState -Force
PS> (Get-Process)[0] | Format-List -Property Threads

Threads : {Wait, Wait, Wait, Wait...}

# revert back    
PS> Update-TypeData -TypeName System.Diagnostics.ProcessThread -DefaultDisplayProperty Id -Force

希望有帮助

于 2013-06-13T09:25:45.810 回答
1

您可以使用

PSStandardMembers.DefaultDisplayProperty

PSStandardMembers.DefaultDisplayPropertySet

对象的属性来确定应为每种类型显示的默认属性。你可以在这里阅读更多关于它的信息。我们最近在类似 PowerShell 项目中遇到了类似的问题。您会发现我们的讨论很有帮助。PS v2 和 v3 之间存在一些细微的差异,我们在该线程上进行了辩论。

于 2013-09-28T08:32:06.393 回答