SharePoint リスト情報を PowerShell を使って CSV で出力する

2020/04/18

体調も悪いので、リスト情報を CSV で出力してみようかと思い立ってサクッと

サンプルコード

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

# 取得する SharePoint Online の URL
$url = 'https://<your tenant>/';

# ユーザー名
$user = '<your account>';

# パスワード
$secure = Read-Host -Prompt "Enter the password for ${user}(Office365)" -AsSecureString;

# SharePoint Online 認証情報
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $secure);

# SharePoint Client Context インスタンスを生成
$ctx= New-Object Microsoft.SharePoint.Client.ClientContext($url)
$ctx.Credentials = $credentials

## ここから処理
$ctx.Load($ctx.Web.Lists)
$ctx.ExecuteQuery();

$data = @()
for ($i=0; $i -lt $ctx.Web.lists.Count; $i++) {
    $t = $ctx.Web.lists[$i]
    if ($t.Hidden -eq $false -and $t.EntityTypeName.IndexOf("List") -ne -1) {
        $line = @{
            Title          = $t.Title;
            Id             = $t.Id;
            Name           = ($t.EntityTypeName.Substring(0, $t.EntityTypeName.IndexOf('List')));
            Path           = ("{0}/Lists/{1}" -f $t.ParentWebUrl.TrimEnd('/'), $t.EntityTypeName.Substring(0, $t.EntityTypeName.IndexOf('List')));
            ItemCount      = $t.ItemCount;
            ItemLastModify = $t.LastItemModifiedDate;
            ItemLastDelete = $t.LastItemDeletedDate;
            Created        = $t.Created;
        }
        $data += New-Object PSObject -Property $line
    }
}
$data | Export-Csv -LiteralPath "<output path>" -Encoding Default -notype

18 行目まではほぼおまじない。

27 行目で「Hidden ではなく、且つ、EntityTypeName に List という文字が入っているものにしています。
32 行目も含めてですが、ちゃんとするなら「List で終わっている」とやったほうがよさそうです。

41 行目で Export-Csv を使って出力しています。

考察

32 行目が本当にこれでいいのかが不明です。
リスト毎に RootFolder を Load して ServerRelativeUrl から割り出すのが正解な気がしています。

データー一括変更の元データーや、一括変更前後の確認などにこういうの使うだろうなー