次の方法で共有


about_Simplified_Syntax

簡単な説明

オブジェクトのコレクションのフィルターをスクリプト化する、より簡単で自然な言語の方法について説明します。

長い説明

Windows PowerShell 3.0 で導入された簡略化された構文を使用すると、スクリプト ブロックを使用せずにいくつかのフィルター コマンドを作成できます。 簡略化された構文は自然言語に似ていますが、主にコマンド Where-Object とそれに ForEach-Object 対応するエイリアス whereforeachにパイプされるオブジェクトのコレクションで便利です。

スクリプト ブロック内の自動変数 $_ を参照せずに、コレクションのメンバー (最も一般的には配列) に対して メソッドを使用できます。

次の 2 つの呼び出しについて考えてみましょう。

標準構文

Get-ChildItem Cert:\LocalMachine\Root |
    Where-Object -FilterScript { $_.FriendlyName -eq 'Verisign' }
Get-ChildItem Cert:\ -Recurse |
    ForEach-Object -FilterScript { $_.GetKeyAlgorithm() }

注意

2 番目のコマンドでは、コレクション内の GetKeyAlgorithm 各オブジェクトに対して メソッドが呼び出されます。 パイプラインから受け取ったオブジェクトに メソッドがない GetKeyAlgorithm 場合、コマンドはエラーを生成します。

簡略化された構文

簡略化された構文では、コレクション内のオブジェクトのメンバーに対して動作する比較演算子がパラメーターとして実装されます。 また、スクリプト ブロック内の自動変数 $_ を参照せずに、コレクション内のオブジェクトに対してメソッドを呼び出すこともできます。 次の 2 つの呼び出しを標準構文の例と比較します。

Get-ChildItem Cert:\LocalMachine\Root |
    Where-Object -Property FriendlyName -EQ 'Verisign'
Get-ChildItem Cert:\ -Recurse |
    ForEach-Object -MemberName GetKeyAlgorithm

Property パラメーターと MemberName パラメーターは位置指定であるため、 コマンドから省略できます。 エイリアスを使用すると、コマンドをさらに簡略化できます。

dir Cert:\LocalMachine\Root | Where FriendlyName -EQ 'Verisign'
dir Cert:\ -Recurse | ForEach GetKeyAlgorithm

どちらの構文も機能しますが、簡略化された構文は、スクリプト ブロック内の自動変数 $_ を参照せずに結果を返します。 簡略化された構文では、自然言語ステートメントのように読み上げられるので、理解しやすくなります。

メソッド名 GetKeyAlgorithm は、 の MemberName パラメーター ForEach-Objectの引数として渡されます。 簡略化された構文を使用して メソッドを呼び出すと、そのオブジェクトにそのメソッドがある場合にのみ、パイプライン内の各オブジェクトに対して メソッドが呼び出されます。 そのため、同じ結果が得られますが、エラーはありません。

次の例では、 Description が の MemberName パラメーター ForEach-Objectに渡されます。 コマンドは、 によってGet-Process返される各 System.Diagnostics.Process オブジェクトの説明を表示します。

Get-Process | foreach Description

この例では、メソッド名 GetFiles がコマンドの MemberName パラメーターに ForEach-Object 渡されます。 値は .*ArgumentList パラメーターに渡されます。 メソッドはGetFiles()、 によって返される各 System.IO.DirectoryInfo オブジェクトの検索パターン パラメーター.*を使用してGet-ChildItem呼び出されます。

Get-ChildItem /home -Directory | foreach GetFiles .*

こちらもご覧ください