PowerShellを利用する上で、オブジェクトがどのような性質や機能を持っているかを正確に把握することは、効率的なスクリプト作成の第一歩となります。
Windows PowerShellからPowerShell 7.x(Core)に至るまで、一貫して中心的な役割を果たすのがGet-Memberコマンドレットです。
このコマンドレットを使いこなすことで、パイプラインを流れるデータの正体を解明し、利用可能なプロパティやメソッドを瞬時に特定できるようになります。
本記事では、初心者から中級者の方に向けて、Get-Memberの基本的な使い方から、実務で役立つ応用的なフィルタリング手法までを詳しく解説します。
PowerShellにおけるオブジェクトとGet-Memberの役割
PowerShellは、テキストベースではなくオブジェクトベースのシェルであることが最大の特徴です。
コマンドの実行結果として出力されるデータは、単なる文字列の羅列ではなく、複数の属性(プロパティ)と操作(メソッド)を持ったデータの塊です。
例えば、プロセスの情報を取得した場合、そのデータにはプロセス名だけでなく、CPU使用率やメモリ使用量、さらには「プロセスを停止する」といった機能が含まれています。
Get-Memberコマンドレットは、これらのオブジェクトが内部にどのような要素を持っているかを確認するための「診断ツール」として機能します。
プログラムを作成する際に、「このオブジェクトから特定のデータを取り出したいが、プロパティ名がわからない」という状況は頻繁に発生します。
そのような場合にGet-Memberを使用すれば、利用可能なすべてのメンバーを一覧表示し、型情報を正確に知ることができます。
公式ドキュメントを確認する手間を省き、コンソール上ですべての情報を完結させられる点が、このコマンドレットの強力なメリットです。
Get-Memberの基本的な使い方
Get-Memberを使用する最も一般的な方法は、調査したいオブジェクトをパイプライン(|)で渡す手法です。
まずは、現在実行中のプロセス情報を取得するGet-Processを例に、その構造を確認してみましょう。
# 実行中のプロセスの一つを取得し、そのメンバーを確認する
Get-Process | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles Property int Handles {get;}
Kill Method void Kill(), void Kill(bool ...
Name Property string Name {get;}
Id Property int Id {get;}
CPU Property double CPU {get;}
... (以下略) ...
実行結果の「TypeName」セクションには、そのオブジェクトがどのクラスに属しているかが表示されます。
この型情報を知ることで、.NETドキュメントを検索する際の正確なキーワードを得ることが可能になります。
また、表形式で表示される「Name」はメンバーの名前、「MemberType」はその種類、「Definition」はその定義を指しています。
初心者のうちは、この中でも特にProperty(プロパティ)とMethod(メソッド)の2種類に注目すると良いでしょう。
プロパティとメソッドの違いを理解する
オブジェクトを操作する上で、プロパティとメソッドの役割を区別することは非常に重要です。
プロパティとは、オブジェクトが保持している「状態」や「値」のことを指します。
例えば、ファイルオブジェクトであれば「ファイル名(Name)」や「サイズ(Length)」、「作成日時(CreationTime)」がプロパティに該当します。
一方でメソッドとは、オブジェクトに対して実行できる「動作」や「命令」のことを指します。
ファイルオブジェクトの場合、「削除する(Delete())」や「移動する(MoveTo())」といったアクションがメソッドとして定義されています。
Get-Memberの結果を確認する際は、情報を取得したいのか、それとも操作を実行したいのかに応じて、見るべき項目を切り替えましょう。
特定のメンバーを絞り込んで確認する手法
複雑なオブジェクトになると、表示されるメンバーの数が数百を超えることも珍しくありません。
そのような場合は、-MemberTypeパラメータを使用して、必要な情報だけを抽出するのが効率的です。
プロパティのみを表示する方法
オブジェクトからどのような値を取り出せるかだけを知りたい場合は、以下のコマンドを使用します。
# サービス情報のオブジェクトからプロパティだけを抽出する
Get-Service | Get-Member -MemberType Property
このフィルタリングにより、メソッドなどの余計な情報が排除され、データの参照に役立つ項目だけが表示されます。
スクリプト内で「Select-Object」を使用する前に、どのプロパティが利用可能かをこの方法で確認するのが定石です。
メソッドのみを表示する方法
オブジェクトに対してどのような操作が行えるかを確認したい場合は、Methodを指定します。
# 日時オブジェクトで使用可能なメソッドを確認する
Get-Date | Get-Member -MemberType Method
日付の加算を行うAddDaysや、書式を変更するToStringなど、実行可能な処理が一覧で表示されます。
「Definition」列を確認することで、そのメソッドにどのような引数が必要か、どのような戻り値が返ってくるかも把握できます。
静的メンバー(Static Member)の確認
通常、Get-Memberは生成された「インスタンス」のメンバーを表示しますが、クラスそのものが持つ静的メンバーを確認することも可能です。
静的メンバーは、オブジェクトを生成(New-Objectなど)せずに、型から直接呼び出せる機能のことです。
例えば、数学的な計算を行うSystem.Mathクラスなどの機能を調べたい時に重宝します。
# 数学関数の静的メンバーを確認する
[System.Math] | Get-Member -Static
これにより、円周率を表すPIプロパティや、絶対値を計算するAbsメソッドなど、インスタンス化せずに使えるメンバーが表示されます。
[DateTime]::Nowのように、型名を角括弧で囲んで指定することで、システム全体のユーティリティ機能を探す際にも役立ちます。
実務で役立つ便利なパラメータと活用例
基本的な使い方以外にも、Get-Memberには運用の現場で役立つ機能がいくつか備わっています。
ここでは、より実践的なテクニックをいくつか紹介します。
隠れたメンバーを表示する -Force
PowerShellのオブジェクトには、通常の状態では隠されているメンバーが存在することがあります。
これらは内部的な処理で使用されることが多いですが、デバッグ時などに確認したい場合があります。
そのような時には、-Forceパラメータを付与することで、すべてのメンバーを強制的に表示できます。
# 通常は見えないメンバーを含めて表示する
Get-Process | Get-Member -Force
名前の一部で検索する -Name
メンバー名の一部がわかっている場合は、-Nameパラメータでワイルドカードを使用できます。
例えば、名前に「Time」が含まれるプロパティだけを探したい場合は以下のように記述します。
# ファイルオブジェクトからTimeを含むメンバーを探す
Get-ChildItem | Get-Member -Name *Time*
膨大なリストの中から目当ての項目をスクロールして探すよりも、この方法の方が遥かに迅速です。
Get-Member使用時の注意点
Get-Memberを使用する際に、初心者が陥りやすい注意点がいくつかあります。
まず、パイプラインで複数のオブジェクトを渡した場合、Get-Memberは最初の1つ目のオブジェクトの型情報を元に結果を表示します。
もし配列の中に異なる型のオブジェクトが混在している場合、すべてのメンバーが表示されない可能性がある点に注意してください。
また、コレクション(配列)そのもののメンバーを確認したい場合は、パイプラインを使わずに-InputObjectパラメータを使用する必要があります。
# 配列オブジェクト自体のプロパティ(Countなど)を確認する
$array = 1,2,3
Get-Member -InputObject $array
パイプラインを使用すると配列の中身(この場合は数値型)が渡されてしまいますが、上記のように記述することで、配列という「入れ物」自体の情報を調べることができます。
便利なTips:エイリアスと結果のソート
効率化のために、Get-Memberにはgmという短いエイリアス(別名)が用意されています。
対話的な操作で素早く確認したい場合は、Get-Process | gmのように入力するのが一般的です。
また、表示結果を名前順ではなく種類順に並べ替えたい場合は、さらにSort-Objectを組み合わせることも可能です。
# メンバー種別でソートして見やすくする
Get-Service | Get-Member | Sort-Object MemberType
| パラメータ | 用途 |
|---|---|
| -MemberType | PropertyやMethodなど、特定の種類でフィルタリングします。 |
| -Name | 特定の名前を持つメンバーを検索します(ワイルドカード可)。 |
| -Static | インスタンスではなく、型の静的メンバーを表示します。 |
| -InputObject | パイプラインを通さずに直接オブジェクトを渡します。 |
| -Force | 隠しメンバーを含めてすべて表示します。 |
まとめ
PowerShellにおけるGet-Memberは、単なる確認コマンド以上の価値を持っています。
それは、オブジェクトの内部構造を解き明かし、スクリプトの可能性を広げるための鍵となるツールです。
どのようなプロパティからデータを取得できるか、どのようなメソッドで操作を自動化できるかを知ることは、開発のスピードと品質を劇的に向上させます。
「困ったらまずは Get-Member で調べる」という習慣を身につけることが、PowerShellマスターへの近道です。
本記事で紹介したフィルタリングや静的メンバーの確認手法を活用し、日々の運用管理業務をよりスマートに進化させていきましょう。
オブジェクトの本質を理解すれば、PowerShellはあなたの期待に応える強力なパートナーになってくれるはずです。
