PowerShell の Expand Property for Select-Object の使用方法

PowerShellのSelect-Objectコマンドレットを使用すると、入力グループのオブジェクトからオブジェクトとプロパティをシームレスに選択できます。しかし、時にはもっと詳しく知る必要があります。 ExpandPropertyは、特定のプロパティの詳細を展開するためのSelect-Objectのスイッチです。

このチュートリアルでは、PowerShellのExpand Property (-ExpandProperty)スイッチのパワーを実例を使って紹介します。

前提条件

このチュートリアルは実演形式です。一緒に進める場合、必要なのはPowerShell 5.1以上がインストールされたWindowsマシンだけです。この記事ではWindows 10マシンにPowerShell 5.1を使用しています。

PowerShell Expand Propertyを使用してプロパティオブジェクトの値を抽出する

Windowsマシンにログインし、PowerShellターミナルを起動します。このセクションでは、Select-ObjectコマンドレットとそのExpandPropertyスイッチについて詳しく説明します。

1. Get-Serviceコマンドレットを実行して、システム上のすべてのサービスのリストを取得します。出力をSelect-Objectコマンドレットにパイプして、各サービスオブジェクトの名前プロパティのみを選択して表示します。以下に示すように、

Get-Service | Select-Object -Property Name

システム上のサービスの名前のリストを表すオブジェクトの単一の列が表示されるはずです(以下は一部のスクリーンショットです)。

Selecting the names of the existing system services

2. 前のパイプラインの末尾でGet-Member cmdletを実行して、select-objectが返すオブジェクトのタイプを確認します。オブジェクトのタイプを知ることで、パイプラインを拡張するための関数やcmdletを作成するのに役立ちます。

Get-Service | Select-Object -Property Name | Get-Member

以下のスクリーンショットを参照してください。-Propertyスイッチが文字列のリストのように見えるものを出力しますが、これらはSystem.ServiceProcess.ServiceControllerオブジェクトの選択されたリストです。

Viewing the type of a ServiceController object with Get-Member

3. Get-Members cmdletをmkdirに置き換えて、各サービスのフォルダを自動的に作成します。-first 5スイッチは返されるオブジェクトの数を制限します。その結果、mkdir関数はパイプライン内のオブジェクトに基づいて5つのフォルダのみを作成します。

Get-Service | Select-Object -Property Name -First 5 | mkdir

成功した試行を示す以下のスクリーンショットのような出力が表示されるはずです。

Creating a folder for the services on your system

4. スニペットのようにmkdirをrmdirに置き換えてフォルダを削除します。ターミナルで冗長な出力を表示するには、-Verboseスイッチをオンにします。

Get-Service | Select-Object -Property Name -First 5 | rmdir -Verbose

rmdirコマンドレットは文字列を期待し、ServiceControllerオブジェクトのhashtable表現を処理できません。試行はいくつかのエラーで失敗するはずです。スクリーンショットに示すように、

Demonstrating that some cmdlets expect string values instead of hashtables

5. -Propertyスイッチを以下のスニペットのように-ExpandPropertyスイッチに変更します。これにより、必要なのが文字列だけの場合、プロパティの値を文字列として取得できます。

Get-Service | Select-Object -ExpandProperty Name -First 5 | rmdir -Verbose

rmdirと組み合わせると、フォルダを自動的に削除しようとする試みがエラーなしに成功するはずです。スクリーンショットに示すように。

Deleting folders named after the services expanded

特定のプロパティを持つ選択されたオブジェクトのセットを作成する

セクション内のコードスニペットを短縮するために、次のようにマシン上の最初の20のサービス用の変数を作成します。

Get-Serviceコマンドを実行し、Select-Objectコマンドレットを使用して最初の20オブジェクトを選択し、オブジェクトを$testServicesという名前の変数に格納します。次のようにNameStatus、およびDependentServicesプロパティのみを選択します。

$testServices = Get-Service | Select-Object -Property Name,Status,DependentServices -First 20

PowerShell Expand Propertyスイッチは一度に1つのプロパティのみを展開できます。これに対して、Propertyスイッチは同時に複数のプロパティを選択できます。

変数名$testServicesを実行して、その内容の構造を表示してください。

$testServices

テーブルが表示され、選択したサービスのプロパティが示されるはずです。以下のスクリーンショットと同様です。

Displaying the contents of $testServices

PowerShell Expand Propertyでコレクションプロパティを展開する

A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.

$testServices変数でSelect-Objectコマンドレットを実行し、各サービスのDependentServicesプロパティを展開してください。

$testServices | Select-Object -ExpandProperty DependentServices

DependentServicesはコレクションプロパティなので、展開されたDependentServicesからの結果が連結され、重複が表示されます。

Expanding the DependentServices property

Categorized OutputのためのPowerShell Expand Propertyのプロパティを組み合わせる

これで、依存するサービスのリストが得られましたが、それらがどのサービスに依存しているかを知る方法はありますか?このセクションでは、展開されたプロパティを分類するために-Propertyスイッチを使用する方法を学びます。

DependentServicesプロパティをNameで分類するには、以下のコマンドを実行してください。

$testServices | Select-Object -ExpandProperty DependentServices -Property Name

依存するサービスは既にNameプロパティを持っているため、分類ステップは失敗します。以下に示されています。

以下のエラーにより、最初のサービスのリスト($testServices内)には、展開されたDependentServicesプロパティのNameプロパティと競合するNameプロパティが既に存在していることがわかります。

Attempting to group an expanded property by the parent object name

1つの回避策は、識別子プロパティを次のようにリネームするために計算されたプロパティを作成することです。

前のコマンドの出力を保存し、識別子プロパティとしてDepends Onという計算されたプロパティを指定するように変更して、変数$depServに保存します。Depends onには、$testService内のすべてのサービスのName値が含まれます。

プロパティ名Depends onは、このチュートリアルでは任意に選択されましたが、お好みの式になります。

$depServ = $testServices | Select-Object -ExpandProperty DependentServices -Property @{name="Depends On"; expr={$_.Name}}

$depServのオブジェクトをSelect-Objectを介して渡して、依存するサービスNameStatus、およびDepends Onプロパティを選択します。

$depServ | Select-Object -Property Name,Status,"Depends On"

これで、$testServicesのサービスに依存するサービスを特定できるようになりました。

Grouping an expanded property using a calculated property

Format-ListとPowerShell Expand Propertyを組み合わせて冗長性を確保

PowerShellは、特に表形式の出力で表示するオブジェクトのプロパティを制限する場合があり、-ExpandPropertyスイッチの出力も同様の場合があります。回避策として、プロパティをリスト形式で拡張して表示することができます。

以下のGet-Processコマンドレットを実行して、explorerプロセスが使用するすべてのmodulesを取得します。モジュールのプロパティを表示するには、-ExpandPropertyスイッチをオンにしてください。

Get-Process explorer | select-object -ExpandProperty Modules

画面上の出力は、自動的に切り詰められて、プロパティが3つしか表示されません。

Viewing the truncated output of an expanded property

パイプオブジェクトをFormat-Listコマンドレットに渡して、モジュールオブジェクトのすべての値をより管理しやすいリスト形式で表示します。

Get-Process explorer | select-object -ExpandProperty Modules | Format-List

以下のように、出力にはすべてのプロパティとその値がリストされます。データをファイルに保存したり、他のコマンドレットに渡してさらなる処理を行ったりすることができます。

Converting the output of an expanded property to a list with Format-List

結論

これまでの成功により、PowerShellのSelect-ObjectコマンドレットのExpand Propertyスイッチ(-ExpandProperty)を活用する方法を見てきました。PowerShellには多くの一般的なタスクに役立つコマンドレットが用意されています。新しい知識をさらに高めるために、PowerShell Catを使用してファイルを素早く表示する方法を学ぶことができます。

Source:
https://adamtheautomator.com/powershell-expand-property/