ByValue を使用してデータを渡す
ByValue を使用してデータを渡す場合、パラメーターは、パラメーターが受け入れる型のオブジェクトである場合に、パイプラインから完全なオブジェクトを受け取ることができます。 1 つのコマンドに、パイプライン入力 ByValue を受け入れる複数のパラメーターを指定できますが、各パラメーターは異なる種類のオブジェクトを受け入れる必要があります。
たとえば、Get-Service では、-InputObject パラメーターと –Name パラメーターの両方でパイプライン入力 ByValue を受け入れることができます。 これらの各パラメーターは、異なる種類のオブジェクトを受け入れます。 –InputObject は ServiceController 型のオブジェクトを受け入れ、 –Name は String 型のオブジェクトを受け入れます。 次に例を示します。
'BITS','WinRM' | Get-Service
ここでは、2 つの文字列オブジェクトが Get-Service にパイプ処理されます。 パラメーターはパイプラインからその種類のオブジェクト ByValue を受け入れるため、-Name パラメーターにアタッチされます。
パイプライン内のオブジェクトで Windows PowerShell が実行する関数を予測するには、パイプライン内のオブジェクトの種類を特定する必要があります。 このためには、オブジェクトを Get-Member にパイプできます。 出力の最初の行は、パイプラインに含まれるオブジェクトの種類を示します。 次に例を示します。
PS C:\> "BITS","WinRM" | Get-Member
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
ここでは、パイプラインには System.String 型のオブジェクトが含まれています。 Windows PowerShell は、多くの場合、型の名前を省略して最後の部分のみを含めます。 この例では、最後の部分は String です。
次に、パイプラインの次のコマンドの完全なヘルプを調べます。 この例では Get-Service であり、 –InputObject パラメーターと –Name パラメーターの両方がパイプライン ByValue からの入力を受け入れることがわかります。 パイプラインには String 型のオブジェクトが含まれており、–Name パラメーターはパイプライン ByValue から String 型のオブジェクトを受け入れるため、パイプライン内のオブジェクトは –Name パラメーターにアタッチされます。
ジェネリック オブジェクト型
Windows PowerShell は、オブジェクトの 2 つのジェネリック型 Object と PSObject を認識します。 これらの種類のオブジェクトを受け取るパラメーターは、任意の種類のオブジェクトを受け取ることができます。 ByValue パイプライン パラメーター バインドを実行すると、Windows PowerShell はまず、可能な限り最も具体的なオブジェクトの種類を探します。 パイプラインに String が含まれており、パラメーターが String を受け取ることができる場合、そのパラメーターはオブジェクトを受け取ります。
特定のデータ型に一致するものがない場合、Windows PowerShell はジェネリック データ型の照合を試みます。 このような動作は、 Sort-Object や Select-Object などのコマンドが機能する理由です。 これらの各コマンドには、パイプライン ByValue から PSObject 型のオブジェクトを受け入れる -InputObject という名前のパラメーターがあります。 これにより、任意の型のオブジェクトをそれらのコマンドにパイプできます。 -InputObject パラメーターは、任意の種類のオブジェクトを受け入れるため、パイプラインから任意のオブジェクトを受け取ります。