からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

SPClient 0.13 をリリースしました

www.powershellgallery.com

コンテンツ タイプに列の追加と削除ができるようになりました。コンテンツ タイプの場合、追加と削除は Field ではなく FieldLink というクラスを使うのですが、使いづらい感じなので隠蔽しています。
また、Debug-SPClientObject という関数を追加しました。これは、ClientObject で読み込まれたプロパティのみを Dictionary にして返すもので、CSOM を PowerShell で使うときに出る「The collection has not been initialized.」のエラーを解決してくれます。

PS> Get-SPClientWeb -Default -Retrieval "Title" | Debug-SPClientObject

Key   Value
---   -----
Title チーム サイト

さらに ConvertTo-Json と組み合わせていい感じにできます。

PS> Get-SPClientWeb -Default -Retrieval "Title" | Debug-SPClientObject | ConvertTo-Json

{
    "Title":  "チーム サイト"
}

CSOM の WebTemplate には Path が入ってこない件

どういうことかというと、以下のコードを実行します。

public static class Program {

    private static void Main(string[] args) {
        var siteUrl = "<サイトの URL>";
        var userName = "<ユーザー名>";
        var rawPassword = "<パスワード>";
        var securePassword = new SecureString();
        foreach (var c in rawPassword) {
            securePassword.AppendChar(c);
        }
        var credentials = new SharePointOnlineCredentials(userName, securePassword);
        var clientContext = new ClientContext(siteUrl) {
            Credentials = credentials
        };
        var webTemplates = clientContext.Web.GetAvailableWebTemplates(1041, true);
        clientContext.Load(webTemplates);
        clientContext.ExecuteQuery();
        Console.ReadLine();
    }

}

f:id:karamem0:20170712095938p:plain

はい、そうですね。Path プロパティの値が null になります。

どういうことだってばよ

CSOM では自らのオブジェクトの場所を特定するために、オブジェクトが Load された後、識別情報を Path プロパティに保持します。*1 たとえばリスト アイテムだと以下のような値が入っています。

5e66049e-800e-4000-b805-a573a858fe86|740c6a0b-85e2-48a0-a494-e0f1759d4aa7:site:217cc400-7454-40e2-8f0d-546625dfb9fb:web:564072f0-9feb-48d6-b7bc-f77e17623c87:list:00077cba-a4e8-460f-a2b3-3a96a2da523f:item:1,1

「site:<GUID>」とか「web:<GUID>」となっているのがそれぞれの親オブジェクトの ID です。Load メソッドを呼び出すときは常にこの値を見るため、WebTemplate を Load しようとすると常に例外が発生します。

f:id:karamem0:20170712095942p:plain

WebTemplate も ClientObject の派生クラスなので同じ動きしてくれないと困るのですが。

*1:Load メソッドの呼び出し前は ObjectPathPropertyObjectPathMethod のような参照情報が入っています。

SPClient 0.12 をリリースしました

www.powershellgallery.com

また 0.11 のリリース告知を忘れてましたので、0.11 と 0.12 の変更点をまとめます。

新たに追加された関数はないのですが、パラメーターの名前が変わったり、既定の動作が変更されたりしています。例えば NoEnumerate パラメーターの追加により、パイプラインでの処理に柔軟性を持たせることができるようになりました。ちなみに内部的には NoEnumerate の値はそのまま Write-Output に渡されています。

SPClientContentType でリスト コンテンツ、SPClientField でサイト列がそれぞれサポートされました。パラメーターに Web を渡すか List を渡すかの違いだけです。

SPClient 0.10 をリリースしました

www.powershellgallery.com

オンライン ヘルプを作りました。PowerShell のヘルプ ドキュメントから Markdown への変換は platyPS というモジュールが役に立ちます。Microsoft の PowerShell Team で開発しており、なかなかいい感じです。

github.com

あとは細かい修正ですが、Use-SPClientType 関数で C:\Program Files\Common Files\Microsoft Shared\Web Server Extension を参照するのをやめて、GAC を参照するようにしました。複数バージョンのアセンブリが入っている場合は新しい方を参照するので、どうしても 2013 (15.0.0.0) バージョンを使いたい場合はパスを指定してください。