🔍

SharePoint 管理シェルで使用されている PipeBind オブジェクトについて

に公開

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 のヘルプを参照します。

https://docs.microsoft.com/en-us/powershell/module/sharepoint-server/Get-SPWeb?WT.mc_id=M365-MVP-5002941

Get-SPWeb
   [[-Identity] <SPWebPipeBind>]
   [-AssignmentCollection <SPAssignmentCollection>]
   [-Confirm]
   [-Filter <ScriptBlock>]
   [-Limit <String>]
   [-Regex]
   [-Site <SPSitePipeBind>]
   [-WhatIf]
   [<CommonParameters>]

Identity パラメーターの型は SPWebPipeBind です。PipeBind とは何かについて説明します。

https://docs.microsoft.com/ja-jp/previous-versions/office/developer/sharepoint-2010/ee534984(v=office.14)?WT.mc_id=M365-MVP-5002941

PipeBind オブジェクトは、SharePoint 用の Windows PowerShell に固有の特別なオブジェクトであり、SharePoint Foundation 用に最適化された特殊なパラメーター セットという第 2 のレイヤーを提供します。

たとえば、SPSite パラメーターを取るコマンドレットは、SPSite オブジェクト自体を取ることも、そのサイト コレクションの GUID 識別子を取ることも、そのサイト コレクションの URL を取ることもできます。Windows PowerShell ランタイムによってどのような表現が与えられても、実際の SPSite オブジェクトがコマンドレットに確実に渡されるようにするのが、SPSitePipeBind オブジェクトの役割です。

つまり、PipeBind オブジェクトが受け皿となり、ユーザーが意識しなくても適切な表現として解釈されます。この PipeBind オブジェクトの仕組みは PowerShell の型変換の仕組みに依存しています。PowerShell は型変換をする際、いくつかの手順で型変換を試みます。その中の 1 つである Constructor conversion により、元の値を渡してコンストラクターが呼び出されます。

https://devblogs.microsoft.com/powershell/understanding-powershells-type-conversion-magic

重要なのは、データの種類を型で判断しているため、同じ型のデータでは判断ができないことと、常に値が文字列で渡ってくる可能性を考慮する必要がある点です。[1]

なお、同様の仕組みは Active Directory モジュールなどにも存在します。ただし、こちらは PipeBind という名前は付いていません。たとえば Get-ADUser の場合、インプットとアウトプットのどちらも ADUser です。個人的には、SharePoint 管理シェルのように別の型になっている方が好みです。

脚注
  1. たとえば PnP-PowerShell の ContentTypePipeBind では文字列の形式で ID か名前かを分岐しています。 ↩︎

Discussion