2007/07/21
「パイプライン入力を許可する: true (ByPropertyName)」の意味
Get-Helpコマンドレットに-fullオプションを付けると、コマンドレットのパラメータの説明に「必須」、「位置」、「既定値」、「パイプライン入力を許可する」、「ワイルドカード文字を許可する」という項目が追加されます。この中で「パイプライン入力を許可する」がtrueになっている場合は、パイプラインからの入力がそのパラメータに渡されるという意味なのですが、これにはByValueとByPropertyNameの二種類があります(同時に指定されていることも)。
この意味お分かりになられますか?
mixiコミュでいろいろと議論した結果、ようやく分かったのでここでご報告しておきます。
ByValueはオブジェクトがそのまま渡ります。これは特に問題ないでしょう。
ByPropertyNameは、パイプを渡ってきたオブジェクトのプロパティが、パラメータ名と一致した場合、そのプロパティをパラメータとして解釈するという意味です。
具体的にGet-ChildItemコマンドレットを取り上げましょう。
Get-ChildItemコマンドレットは-pathパラメータがtrue (ByValue, ByPropertyName)、-literalPathパラメータ(エイリアスは-PSPath。ちなみにパラメータのエイリアスを調べるには(Get-Command Get-ChildItem).parametersetsのようにするとパラメータの一覧が出ますので、そのAliasを見てください)がtrue (ByPropertyName)です。
よって、入力オブジェクトにPathプロパティがあればその値が-pathパラメータに渡ります。(なければ入力オブジェクトがそのまま-pathパラメータに渡されます)。また、入力オブジェクトにLiteralPathプロパティまたはPSPathプロパティがあれば、-literalPathパラメータにその値が渡ります。これを検証します。
Get-ChildItemコマンドレットの戻り値はファイルシステムプロバイダにおいてはFileInfoオブジェクトとDirectoryInfoオブジェクトを含んだ配列です。これらのオブジェクトにはPSPathプロパティがあるので、この結果をパイプで次のGet-ChildItemコマンドレットに渡すと、そのPSPathプロパティが、-literalPathパラメータに渡ります。すなわちこういうことです。
PS C:\script> Get-ChildItem a*|Get-ChildItem ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\script Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2007/07/20 18:33 0 a.txt -a--- 2007/07/21 16:17 8826 about_Alias.help.txt
このコマンドに意味があるかどうかは別にして、そういうことが可能だということです。
もっと分かりやすいと思われる例を示しましょう。$aというオブジェクトを作成し、それにAdd-MemberコマンドレットでPathという名前のNotePropertyを追加します。そして$aをパイプラインを通じてGet-ChildItemコマンドレットに渡すとどうなるかご覧ください。
PS C:\script> $a = New-Object PSObject PS C:\script> $a = $a | Add-Member noteproperty Path "a*" -passthru PS C:\script> $a.path a* PS C:\script> $a|Get-ChildItem ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\script Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2007/07/20 18:33 0 a.txt -a--- 2007/07/21 16:17 8826 about_Alias.help.txt
というわけで無事、Pathプロパティが-pathパラメータに渡っていることがお分かりいただけると思います。
元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/07/21/86361.aspxプライバシーポリシー