例如,查看进程线程会显示如下内容:
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
所需要的是一种读取为对象定义的格式定义并直接检索它,然后使用它来输出所需字符串的方法。我没有在网上找到任何例子。