PnP.PowerShellについて ＆ SharePoint内のドキュメントファイルをリスト化

# PnP.PowerShellとは
SharePointを管理するためのPowerShellモジュールです。
SharePoint OnlineおよびSharePoint Serverの様々な管理タスクを自動化できます。

## インストール方法
基本的にはPowerShellを管理者として実行して、下記のコマンドでモジュールをインストールします。
```powershell
Install-Module -Name PnP.PowerShell
```
インストールに関しての詳細は下記ページに書かれています。

https://pnp.github.io/powershell/articles/installation.html

## 基本的なコマンド
### SharePointへの接続
SharePointの管理タスクを実行するために、まずSharePointのサイトに接続する必要があります。
接続するためには、```Connect-PnPOnline```というコマンドを使用します。
私の環境では、多要素認証を使用しているので、```-UseWebLogin```というオプションも付けます。
```powershell
Connect-PnPOnline -Url "<サイトURL>" -UseWebLogin
```
その他情報は下記ページを参照して下さい。

https://pnp.github.io/powershell/cmdlets/Connect-PnPOnline.html

### ページの作成
ページの作成は```Add-PnPPage```を使用します。
```powershell
Add-PnPPage -Name "<ページ名>" -Title "<ページタイトル>" -PageLayoutType "<ページレイアウト>" [-PromoteAsNewsArticle] [-HeaderType "<ヘッダータイプ>"] [-HeaderLayoutType "<ヘッダーレイアウトタイプ>"]
```

https://pnp.github.io/powershell/cmdlets/Add-PnPPage.html

### リストの作成
SharePointサイト内でのリストの作成は```New-PnPList```を使用します。
リストテンプレートには、汎用リストであれば```GenericList```、アナウンスリストであれば```Announcements``を指定して下さい。

```powershell
New-PnPList -Title "<リストタイトル>" -Template "<リストテンプレート>"
```
https://pnp.github.io/powershell/cmdlets/Add-PnPPage.html

# 本題
## SharePoint内のドキュメントファイルをリスト化したい
今回はPowerShellのスクリプトを作成して、リスト化していきます。
リストの出力先はCSVファイルにしました。

### 実装について
実装はWindows PowerShell ISEを使用して行いました。
ISEの詳細については以下を参照して下さい。

https://learn.microsoft.com/ja-jp/powershell/scripting/windows-powershell/ise/introducing-the-windows-powershell-ise?view=powershell-7.3

CSVのリストの列は、ファイル名、ファイルかフォルダかの種類、ファイルの種類、URL、作成者のmail、作成日、最後に編集した日、最後に編集した人のmailを設定しました。

### 実装本体
```php
# サイトURL定義
$SiteURL= "<サイトURL>"
#ドキュメントのフォルダを指定
$ListName="Shared Documents"
# 出力先定義
$ReportOutput = "C:\Users\user\SharePointList.csv"
# リスト取得最大ファイル数の定義
$Pagesize = 500

#SharePointサイトに接続
Connect-PnPOnline -Url $SiteURL -UseWebLogin

#CSV作成前に既存ファイル削除
If (Test-Path $ReportOutput) { Remove-Item $ReportOutput}
   
#ドキュメント情報の取得
$List  = Get-PnPList -Identity $ListName
$global:counter = 0;

#プロパティを指定して情報取得
$ListItems = Get-PnPListItem -List $ListName -PageSize $Pagesize -Fields Author, Editor, Created, File_x0020_Type -ScriptBlock `
        { Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete ($global:Counter / ($List.ItemCount) * 100) -Activity `
             "Getting Documents from Library '$($List.Title)'" -Status "Getting Documents data $global:Counter of $($List.ItemCount)";} | Where {$_.FileSystemObjectType -eq "File"}
  
$ItemCounter = 0

#結果を入れる空の配列用意
$Results = @()

#取得した要素を整理
Foreach ($Item in $ListItems)
{
#プロパティをCSVの任意の列に当てはめる
        $Results += New-Object PSObject -Property ([ordered]@{
            #ファイル名
            Name              = $Item["FileLeafRef"]
            #ファイルかフォルダか
            Type              = $Item.FileSystemObjectType
            #ファイルの種類
            FileType          = $Item["File_x0020_Type"]
            #URL
            RelativeURL       = $Item["FileRef"]
            #作成者のmail
            CreatedByMail    = $Item["Author"].Email
            #作成日
            CreatedOn         = $Item["Created"]
            #最後に編集した日
            Modified          = $Item["Modified"]
            #最後に編集した人のmail
            ModifiedByMail   = $Item["Editor"].Email
        })
    $ItemCounter++
    Write-Progress -PercentComplete ($ItemCounter / ($List.ItemCount) * 100) -Activity "Exporting data from Documents $ItemCounter of $($List.ItemCount)" -Status "Exporting Data from Document '$($Item['FileLeafRef'])"        
}
  
#CSVに出力
$Results | Export-Csv -Path $ReportOutput -NoTypeInformation
   
Write-host "出力完了"

#SharePointサイト切断
Disconnect-PnPOnline
```
説明については上記コメントアウトを参照下さい。
参考にしたサイトは以下です。

https://www.sharepointdiary.com/2018/08/sharepoint-online-powershell-to-get-all-files-in-document-library.html