データの選択

完了

コマンドの実行は強力な場合があり、ローカル コンピューターから、またはネットワークを介してデータを取得することができます。 さらに効果を上げるには、必要なデータを取得する方法を学ぶ必要があります。 ほとんどのコマンドは、入力、出力、またはその両方という方法でオブジェクトを操作します。 オブジェクトにはプロパティがあり、それらのプロパティのサブセットにアクセスして、レポートに表示することができます。 さらに、1 つまたは複数のプロパティに基づいてデータを並べ替えることもできます。 ただし、それを実行するにはどうすればよいでしょうか。

Get-Member を使用して出力を検査する

コマンドの結果を Get-Member に渡すと、Get-Member からオブジェクトに関する、次のような情報が返されます。

  • Get-Member に渡されるオブジェクトの種類。
  • 評価することができるオブジェクトのプロパティ。
  • 実行することがでるオブジェクトのメソッド。

コマンド Get-Member に対して Get-Process を実行して、このことを示してみましょう。

Get-Process | Get-Member

パイプ | をどのように使用しているか、また Get-Member を呼び出すことで、実際には既にパイプラインを作成していることに注意してください。 前のステートメントからの出力の最初の数行は、次のようなものです。

TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------
Handles                    AliasProperty  Handles = Handlecount
Name                       AliasProperty  Name = ProcessName
NPM                        AliasProperty  NPM = NonpagedSystemMemorySize64
PM                         AliasProperty  PM = PagedMemorySize64
SI                         AliasProperty  SI = SessionId
VM                         AliasProperty  VM = VirtualMemorySize64
WS                         AliasProperty  WS = WorkingSet64
...

出力には、Get-Process コマンドから返されるオブジェクトの種類 (System.Diagnostics.Process) が示されます。 応答の残りの部分には、オブジェクトのメンバーの名前、型、および定義が表示されます。 Get-Process をパイプライン内の別のコマンドに適合させたい場合は、Get-Member と組み合わせるのが最初のステップとして適しています。

セレクトオブジェクト

既定では、画面に出力されるコマンドを実行すると、PowerShell によって自動的にコマンド Out-Default が追加されます。 出力データがオブジェクトのコレクションである場合には、PowerShell によってオブジェクトの種類が確認され、そのオブジェクトの種類に登録されたビューがあるかどうかが判断されます。 見つかった場合は、そのビューが使用されます。

通常、画面に適切に表示されないので、ビューにはオブジェクトのすべてのプロパティが含まれていません。そのため、最も一般的なプロパティの一部のみがビューに含まれています。

Select-Object を使用して独自のプロパティ一覧を選択することで、既定のビューをオーバーライドすることができます。 これで、それらのプロパティを Format-Table または Format-List に送信し、好きなようにテーブルを表示できるようになります。

プロセス Get-Process に対して zsh を実行した結果を考えてみましょう。

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.01       0.38     644 620 zsh
      0     0.00       0.01       0.38     727 727 zsh
      0     0.00       0.01       0.38     731 731 zsh
      0     0.00       0.01       0.38     743 743 zsh
      0     0.00       0.01       0.38     750 750 zsh
      0     0.00       0.88       0.91   15747 …47 zsh
      0     0.00       0.01       0.29   41983 …83 zsh
      0     0.00       1.16       0.31   68298 …98 zsh

表示されるビューは、このコマンドから最も表示させたいビューになります。 ただし、このビューには情報の完全なセットは表示されません。 別のプロパティを表示するには、結果に表示するプロパティを明示的に指定します。

完全な応答の取得

ここまで見てきたのは、限られた応答です。 完全な応答を表示するには、次のようにワイルドカード * を使用します。

Get-Process zsh | Format-List -Property *

* 文字は、すべての属性とその値を示し、これによって関心のある値を調べることができます。 完全な応答では、実際のプロパティ名の代わりにプロパティのプレゼンテーション名も使用され、レポートではプレゼンテーション名の方が見た目に優れています。

これらの利点にもかかわらず、データの完全な出力は必要ないかもしれませんが、デフォルトの応答に満足していない場合もあります。

特定の列の選択

応答を制限し、既定の応答と完全な応答の間の中間点を見つけるには、関心のあるプロパティをいくつか選択し、それを Select-Object へのパラメーター入力として使用します。 ただし、ここで問題になるのが、列の実際の名前を使用する必要があるということです。 実際の名前を調べるにはどうすればよいでしょうか。 Get-Member を使用してください。 Get-Member を呼び出すと、すべてのプロパティとその実際の名前がわかります。

実際のプロパティ名の検索

このサブセットを使用して、既定の応答について簡単におさらいしましょう。

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.01       0.38     644 620 zsh

既定の応答から、プロパティ IdProcessName は同じ名前である可能性が高いのですが、CPU(s) はプレゼンテーション名であり、実際のプロパティ名は、スペースなしのテキスト文字のみで構成される傾向があります。 特定のプロパティの実際の名前を確認するには、Get-Member を使用します。

Get-Process zsh | Get-Member -Name C*

これで、C で始まる名前を持つすべてのメンバーのリストが表示されます。 その中には CPU があり、おそらくこれが望まれているものです。

TypeName: System.Diagnostics.Process

Name             MemberType     Definition
----             ----------     ----------
CancelErrorRead  Method         void CancelErrorRead()
CancelOutputRead Method         void CancelOutputRead()
Close            Method         void Close()
CloseMainWindow  Method         bool CloseMainWindow()
Container        Property       System.ComponentModel.IContainer Container {get;}
CommandLine      ScriptProperty System.Object CommandLine {get=…
Company          ScriptProperty System.Object Company {get=$this.Mainmodule.FileVersionInfo.CompanyName;}
CPU              ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;}

次のように、Select-Object を使用して、適切なプロパティ名で必要な情報を正確に確認する方法を理解しました。

Get-Process zsh | Select-Object -Property Id, Name, CPU

次のとおりです。

Id Name       CPU
-- ----       ---
644 zsh  0.3812141
727 zsh  0.3826498
731 zsh  0.3784953
743 zsh  0.3776352
750 zsh  0.3824036
15747 zsh  0.9097993
41983 zsh  0.2934763
68298 zsh  0.3121695

このコマンド シーケンスでは、既定の出力とは異なるものの、関心のあるプロパティが含まれている出力が得られます。

並べ替え

パイプラインで Sort-Object を使用する場合、PowerShell は最初に既定のプロパティを使用して出力データを並べ替えます。 そのようなプロパティが存在しない場合には、オブジェクト自体の比較が試行されます。 並べ替えは、昇順または降順で行われます。

プロパティを指定することで、次のように特定の列での並べ替えを選択することができます。

Get-Process | Sort-Object -Descending -Property Name

前のコマンドでは、Name 列を降順に並べ替えています。 複数の列で並べ替える場合には、次のように列名をコンマで区切ります。

Get-Process | Sort-Object -Descending -Property Name, CPU

列名での並べ替えに加えて、独自のカスタム式を指定することもできます。 この例では、カスタム式を使用して列 Name および CPU で並べ替え、各列の並べ替え順序を制御します。

Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}

前の例は、Sort-Object がどれほど強力で柔軟になり得るかを示しています。 このテーマはやや高度であり、このモジュールの範囲からは外れますが、より高度なモジュールで改めて説明します。