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

フォーマット リストには、オブジェクトをインテリジェントに要約する方法があることは明らかです。オブジェクトのリストを取得し、それぞれから代表的なプロパティを引き出して、短い配列として表示しました。オブジェクトのコレクションを同じ方法で要約できるメソッドまたはコマンドレットが見つかりません。

オブジェクトの任意のコレクションをメソッドに渡して要約できるようにしたいと考えています。これは、Exchange オブジェクトに電子メール アドレスを一覧表示する場合、AD オブジェクトにグループを一覧表示する場合、および他の多くの場所で使用されます...これらはすべて特殊なケースではないと思います。


拡張するには (@JoelSmith のコメントから詳細を学んだ後):

.NET オブジェクトには、出力をフォーマットするときに Powershell によって使用されるフォーマット定義があります。追加の詳細は[1]を使用して入手できます。これらの定義は一般的で、任意のコマンドでアクセスできますが、既定では、Powershell には、オブジェクト プロパティの出力を Format-List に表示されるように直接取得する関数はありません。help about_Format.ps1xml

ハック的な回避策の 1 つは、次のように出力を分割して削除することです。

(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

このようなものをお探しですか?

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

   Id
   --
13060
13064
13068
13072
13076
13080
13084

これは、出力内容と必要なフィールドに応じて、コマンドレットごとにカスタマイズする必要があります。それが機能しない理由(Get-Process)[0] | Format-Table -Property Threads -AutoSizeは、Threadsスレッド オブジェクトを返し、オブジェクトの配列が最初のサンプル (コレクション内のオブジェクトの文字列表示) のように表示されるためです{ .. }

于 2013-06-12T21:08:22.617 に答える
1

通常 .ToString() は機能しますが、そのメソッドの実装を忘れることがあります。

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

編集:以下のコメントに答える

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

残念ながら、すべてのコマンドレットが同じというわけではありません。

于 2013-06-12T20:00:17.793 に答える