SharePoint 管理シェルで使用されている PipeBind オブジェクトについて
この記事は PowerShell Advent Calendar 2017 の参加記事です。
SharePoint 管理シェルでは、たとえば Get-SPWeb
の Identity
パラメーターに URL または ID (GUID) を渡すことができます。下記の例ではあえてキャストしていますが、もちろん文字列そのままを渡すこともできます。
$web1 = Get-SPWeb -Identity [uri]'https://sharepoint.example.com'
$web2 = Get-SPWeb -Identity [guid]'909fb5bd-2ae3-4968-8ca6-b23f962d7300'
あるいは、SPWeb
オブジェクトそのものを渡すこともできます。
$web3 = Get-SPWeb -Identity $web1
これがどのように実現されているかを見てみます。まずは Get-SPWeb
のヘルプを見てみます。
Get-SPWeb
[[-Identity] <SPWebPipeBind>]
[-AssignmentCollection <SPAssignmentCollection>]
[-Confirm]
[-Filter <ScriptBlock>]
[-Limit <String>]
[-Regex]
[-Site <SPSitePipeBind>]
[-WhatIf]
[<CommonParameters>]
Identity
パラメーターの型は SPWebPipeBind
です。PipeBind
とはなんでしょうか。その答えは以下に説明があります。
PipeBind オブジェクトは、SharePoint 用の Windows PowerShell に固有の特別なオブジェクトであり、SharePoint Foundation 用に最適化された特殊なパラメーター セットという第 2 のレイヤーを提供します。
たとえば、SPSite パラメーターを取るコマンドレットは、SPSite オブジェクト自体を取ることも、そのサイト コレクションの GUID 識別子を取ることも、そのサイト コレクションの URL を取ることもできます。Windows PowerShell ランタイムによってどんな表現が与えられようとも、実際の SPSite オブジェクトがコマンドレット自体に間違いなく与えられるようにするのは、SPSitePipeBind オブジェクトの役目です。
つまり PipeBind
オブジェクトがいい感じに受け皿となって、ユーザーが意識しなくても適切な表現として解釈してくれるというわけですね。この PipeBind
オブジェクトのトリックは PowerShell の型変換の仕組みに依存しています。PowerShell は型変換をするときに、いくつかの手順で型変換を試みます。その中の手順のひとつである Constructor conversion により、元の値を渡してコンストラクターを呼び出してくれます。
大事なのは、データの種類を型で判断しているので、同じ型のデータでは判断ができないことと、常に値が文字列で渡ってくる可能性を考慮することです。[1]
ちなみに、同様の仕組みは、Active Directory モジュールなどにもあります。ただし、こちらは PipeBind
という名前はついていません。たとえば Get-ADUser
の場合、インプットとアウトプットのどちらも ADUser
です。個人的には SharePoint 管理シェルのように別の型になっていたほうが好みです。
-
たとえば
PnP-PowerShell
の ContentTypePipeBind を見ると無理やり感が漂っています。 ↩︎
Discussion