簡単な説明
オブジェクトのコレクションに対するフィルターを、自然言語で書くようにより簡単に記述する方法について説明します。
長い説明
Windows PowerShell 3.0で導入された簡略化構文を使用すると、一部のフィルター コマンドはスクリプト ブロックなしで記述できます。 この簡略化構文は自然言語に近い形式となっており、Where-Object や ForEach-Object (またはそれらのエイリアスである where や foreach) にパイプでオブジェクトのコレクションを渡して処理する場合に、特に便利です。
スクリプト ブロック内で自動変数 $_ を参照することなく、コレクション (主に配列) のメンバーに対してメソッドを使用できます。
次の 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 メソッドを、 の ForEach-Object パラメーターの引数として渡すとします。 簡略化構文で、パイプライン内の各オブジェクトに対してこのメソッドを呼び出そうとすると、そのメソッドがあるオブジェクトに対してのみ呼び出されます。 そのため、エラーなしで同じ結果を得ることができます。
次の例では、Description を の ForEach-Object パラメーターに渡しています。 このコマンドは、 によって返された各 Get-Process オブジェクトの説明を表示します。
Get-Process | foreach Description
次の例では、GetFiles メソッドを コマンドの ForEach-Object パラメーターに渡しています。
.* の値を ArgumentList パラメーターに渡しています。
GetFiles() によって返された各 .* オブジェクトに対して、 メソッドを、検索パターン パラメーター Get-ChildItem を指定して呼び出しています。
Get-ChildItem /home -Directory | foreach GetFiles .*
こちらも参照ください
PowerShell