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コマンドレットにパイプして、各サービスオブジェクトの名前プロパティのみを選択して表示します。以下に示すように、
システム上のサービスの名前のリストを表すオブジェクトの単一の列が表示されるはずです(以下は一部のスクリーンショットです)。

2. 前のパイプラインの末尾でGet-Member cmdletを実行して、select-objectが返すオブジェクトのタイプを確認します。オブジェクトのタイプを知ることで、パイプラインを拡張するための関数やcmdletを作成するのに役立ちます。
以下のスクリーンショットを参照してください。-Propertyスイッチが文字列のリストのように見えるものを出力しますが、これらはSystem.ServiceProcess.ServiceControllerオブジェクトの選択されたリストです。

3. Get-Members cmdletをmkdirに置き換えて、各サービスのフォルダを自動的に作成します。-first 5スイッチは返されるオブジェクトの数を制限します。その結果、mkdir関数はパイプライン内のオブジェクトに基づいて5つのフォルダのみを作成します。
成功した試行を示す以下のスクリーンショットのような出力が表示されるはずです。

4. スニペットのようにmkdirをrmdirに置き換えてフォルダを削除します。ターミナルで冗長な出力を表示するには、-Verboseスイッチをオンにします。
rmdirコマンドレットは文字列を期待し、ServiceControllerオブジェクトのhashtable表現を処理できません。試行はいくつかのエラーで失敗するはずです。スクリーンショットに示すように、

5. -Propertyスイッチを以下のスニペットのように-ExpandPropertyスイッチに変更します。これにより、必要なのが文字列だけの場合、プロパティの値を文字列として取得できます。
rmdirと組み合わせると、フォルダを自動的に削除しようとする試みがエラーなしに成功するはずです。スクリーンショットに示すように。

特定のプロパティを持つ選択されたオブジェクトのセットを作成する
セクション内のコードスニペットを短縮するために、次のようにマシン上の最初の20のサービス用の変数を作成します。
Get-Service
コマンドを実行し、Select-Object
コマンドレットを使用して最初の20
オブジェクトを選択し、オブジェクトを$testServices
という名前の変数に格納します。次のようにName
、Status
、およびDependentServices
プロパティのみを選択します。
PowerShell Expand Propertyスイッチは一度に1つのプロパティのみを展開できます。これに対して、Propertyスイッチは同時に複数のプロパティを選択できます。
変数名$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
プロパティを展開してください。
DependentServices
はコレクションプロパティなので、展開されたDependentServices
からの結果が連結され、重複が表示されます。

Categorized OutputのためのPowerShell Expand Propertyのプロパティを組み合わせる
これで、依存するサービスのリストが得られましたが、それらがどのサービスに依存しているかを知る方法はありますか?このセクションでは、展開されたプロパティを分類するために-Property
スイッチを使用する方法を学びます。
DependentServices
プロパティをName
で分類するには、以下のコマンドを実行してください。
依存するサービスは既にName
プロパティを持っているため、分類ステップは失敗します。以下に示されています。
以下のエラーにより、最初のサービスのリスト($testServices内)には、展開されたDependentServicesプロパティのNameプロパティと競合するNameプロパティが既に存在していることがわかります。

1つの回避策は、識別子プロパティを次のようにリネームするために計算されたプロパティを作成することです。
前のコマンドの出力を保存し、識別子プロパティとしてDepends Onという計算されたプロパティを指定するように変更して、変数$depServに保存します。Depends onには、$testService内のすべてのサービスのName値が含まれます。
プロパティ名Depends on
は、このチュートリアルでは任意に選択されましたが、お好みの式になります。
$depServ
のオブジェクトをSelect-Object
を介して渡して、依存するサービスName
、Status
、およびDepends On
プロパティを選択します。
これで、$testServices
のサービスに依存するサービスを特定できるようになりました。

Format-ListとPowerShell Expand Propertyを組み合わせて冗長性を確保
PowerShellは、特に表形式の出力で表示するオブジェクトのプロパティを制限する場合があり、-ExpandProperty
スイッチの出力も同様の場合があります。回避策として、プロパティをリスト形式で拡張して表示することができます。
以下のGet-Process
コマンドレットを実行して、explorer
プロセスが使用するすべてのmodules
を取得します。モジュールのプロパティを表示するには、-ExpandProperty
スイッチをオンにしてください。
画面上の出力は、自動的に切り詰められて、プロパティが3つしか表示されません。

パイプオブジェクトをFormat-List
コマンドレットに渡して、モジュールオブジェクトのすべての値をより管理しやすいリスト形式で表示します。
以下のように、出力にはすべてのプロパティとその値がリストされます。データをファイルに保存したり、他のコマンドレットに渡してさらなる処理を行ったりすることができます。

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