PowerShell Select-Objectの簡単な使い方:初心者向けガイド

PowerShellはデータ管理の強力なツールですが、通常は一度にあまりにも多くの情報を提供します。あまりにも多くの情報は圧倒され、解析するのが難しいことをご存知のように。しかし心配はいりません。PowerShell Select-Objectコマンドレットが役立ちます。

このチュートリアルでは、Select-Objectコマンドレットの基礎を学び、さまざまな方法で結果を絞り込む方法を学びます。

読んで、痛みのないデータ管理を開始しましょう!

前提条件

このチュートリアルには実演が含まれています。一緒に進むためには、PowerShellがインストールされたシステムをお持ちであることを確認してください。このチュートリアルでは、PowerShell 7を使用してWindows 10を使用していますが、どのモダンなバージョンでも動作するはずです。

PowerShell Select-Objectコマンドレットとは何ですか?

Select-Objectコマンドレットは、オブジェクトやデータセットから特定のプロパティを選択したり、プロパティの名前を変更したり、既存のプロパティに基づいて計算されたプロパティを作成したりすることで、データ管理を簡素化します。

基本的な Select-Object の構文は次のとおりです:

Parameter Function
-InputObject Specifies the object or data set you want to work with, which can be an object, an array of objects, or an output of another cmdlet.
Property Specifies the property or properties to select from the InputObject parameter. You can specify multiple properties separated by commas.
Optional Parameters Allows you to refine your selection, such as selecting a certain number of objects or skipping objects.
Select-Object [-InputObject] [Property] [Optional Parameters]

プロパティによるオブジェクトの選択

Select-Object コマンドレットについて学びたいという欲求を満たすためには、短い紹介以上のものが必要です。なぜなら、 Select-Object コマンドレットの一般的な使用例から始めるのはどうでしょうか? このチュートリアルを開始するには、 Select-Object コマンドレットを使用してオブジェクトから特定のプロパティを選択します。

コンピューター上で実行されているプロセスのリストがあるとしましょうが、各プロセスの名前だけを表示したい場合。 Select-Object コマンドレットに Name プロパティを指定すると、うまくいきます。

PowerShell を開き、以下の Get-Process コマンドを実行して、全プロセスのリストを取得し、Name によってのみ (Select-Object) 印刷します。

Get-Process | Select-Object Name
Selecting objects by property

実行中のプロセス以外にも、 Select-Object コマンドレットを使用して CSV ファイルで作業することができます。多くの列を持つ CSV ファイルがあると仮定し、そのうちのいくつかだけが必要な場合、 Select-Object コマンドレットによって関連する列のみを選択してデータを操作および分析できます。

次のコマンドを実行して、複数のプロパティ(Select-Object)を選択します:NameCPU(カンマで区切られます)。この機能は、各オブジェクトの一部のプロパティのみが必要な大規模なデータセットで作業する場合に役立ちます。

さらに、このコマンドではオブジェクトのリストをSort-Objectを使用してCPUプロパティを参照にして-Descendingの順でソートします。

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

以下に、Google Chrome(インストールされている場合)から始まる、最もリソースを消費するプロセスのリストが表示されます。

Selecting multiple properties

計算プロパティの作成

ニーズに合ったプロパティを探す際には、計算プロパティの作成を検討してください。なぜなら、計算プロパティを使用すると、データを操作して変換したり、既存のプロパティを組み合わせたり、数学的な操作を行ったり、データを特定の方法でフォーマットしたりできるからです。

計算プロパティを作成するには、新しいプロパティ名と、プロパティの値を計算する方法を定義する式を指定する必要があります:

以下のコマンドを実行して、次の操作を行います:

  • 実行中のプロセスのリスト(Get-Process)を取得し、NameCPUのプロパティのみを選択します(Select-Object)。
  • 新しい計算されたプロパティを作成してください。そのプロパティの名前はName Memory (MB)であり、各プロセスのメモリ使用量をメガバイト単位で計算します。メモリ使用量は、WorkingSetプロパティを1MBで割るExpressionを使用して計算されます。
  • 計算されたMemory (MB)プロパティによって取得された実行中のプロセスを-Descendingの順ですべて表示します。
Get-Process | Select-Object Name, CPU, @{Name="Memory (MB)";Expression={$_.WorkingSet/1MB}} | Sort-Object -Descending "Memory (MB)"
Creating a calculated property

指定されたプロパティを除外する

Select-Objectコマンドの結果には、ユーザ名やパスワードなどの機密情報が含まれる可能性があります。このリスクを回避する方法は?

出力に機密データを表示しないようにするには、-ExcludePropertyパラメータを追加して特定のプロパティを出力から除外します。

次のコマンドを実行して、以下のタスクを実行します:

  • C:\\ディレクトリの中で再帰的に(-RecurseGet-ChildItemを使用して、すべてのファイルとフォルダーのリストを取得します。
  • パイプ出力をSelect-Objectコマンドレットにパイプして、NameLengthLastWriteTimeプロパティを選択します。
  • 出力からFullNameプロパティを除外(-ExcludeProperty)します。これにより、出力に完全なパスが表示されず、機密情報が含まれないようになります。
Get-ChildItem -Path C:\ -Recurse | Select-Object Name, Length, LastWriteTime -ExcludeProperty FullName
Excluding a specified property

オブジェクトの最初または最後の数をスキップ

大規模なデータセットで作業する場合、必要なデータを見つけることは石炭鉱山でダイヤモンドを探すようなものです。しかし、関連のないデータをふるいにかける時間を無駄にする必要はありません。

PowerShellでは、Select-Objectコマンドレットには、出力から最初の(-Skip)および最後の(-SkipLast)オブジェクトの数をそれぞれ除外する2つのパラメータが用意されています。

出力から複数のオブジェクトをスキップする方法を確認するには:

以下のコマンドを実行して、すべての実行中プロセス(Get-Process)を取得しますが、最初の100オブジェクトを-Skipします。

スキップされるオブジェクトの数は、この場合は整数値(小数点なしの正の整数)に基づいていますが、100です。

Get-Process | Select-Object -Skip 100
Skipping the first 100 objects

次に、以下のコマンドを実行して、作業ディレクトリの内容(Get-ChildItem)のリストを取得しますが、最後の100オブジェクトをスキップします(-SkipLast

Get-ChildItem | Select-Object -SkipLast 100
Skipping the last 100 objects

オブジェクトの最初または最後の数を選択

最初と最後のオブジェクトの数をスキップするだけでなく、最初と最後のオブジェクトを選択することにも興味があるかもしれません。Select-Objectコマンドレットは、FirstおよびLastパラメータを使用して、他のすべてをスキップして時間とリソースを節約できます。

Get-Process | Select-Object -First 10
Selecting the first 10 objects returned

以下のコマンドを実行してすべてのプロセスを取得し、ただし、返されるオブジェクトの-First 10を選択します。

Get-ChildItem | Select-Object -Last 10
Selecting the last 10 objects returned

次に、以下のコマンドを実行して作業ディレクトリのすべてのコンテンツ(Get-ChildItem)を取得し、ただし、返されるオブジェクトの-Last 10を選択します。

排他的にユニークなオブジェクトを選択する

大きなデータセットで作業する際、典型的には出力から除外したい重複した値に遭遇することがあります。ただし、Select-Objectコマンドレットの良い点は、重複した値を手動で除外する必要がないことです。

-Uniqueパラメータを追加すると、出力から一意のオブジェクトのみを選択でき、分析を合理化し、結果の正確性を向上させることができます。

"1","1","2","3" | Select-Object -First 2

以下のコマンドを実行して、-First 2のオブジェクトを選択し、返します。

Selecting and returning objects with duplicate values

最後に、次のコマンドを実行して、-First 2のオブジェクトごとに唯一の-Unique値のみを返します。

"1","1","2","3" | Select-Object -First 2 -Unique

このとき、他方は重複した値だけが含まれているため、最初の2つのオブジェクトからは1つしか返されません。ご理解いただけるように、この出力は-Uniqueパラメータがデータ内の重複したオブジェクトを素早く破棄するのに便利であることを示しています。

Selecting unique objects exclusively

結論

PowerShellは情報の過多を生み出す傾向があります。しかし、このチュートリアルでは、PowerShellのSelect-Objectコマンドレットがデータを整理し、必要な情報のみを表示するのにどれほど役立つかを学びました。

異なるパラメータが出力からデータを選択および除外する方法を見てきました。特にSelect-Objectコマンドレットを使用すると、大量のデータを管理することは困難ではありません。

この時点で、結果を分析およびトラブルシューティングに適した形に素早く調整できます。ただし、なぜ次に進んで計算されたプロパティをフォーマットする方法を学ばないのでしょうか?

Source:
https://adamtheautomator.com/powershell-select-object/