📡

SharePoint リストの添付ファイルを一括でダウンロードする方法 (Get-PnPListItemAttachment)

2022/07/11に公開

はじめに

SharePoint リストの添付ファイル列にアップロードしたファイルを PnP PowerShell のコマンドを使用してダウンロードする方法をまとめてみました。

使用するコマンド

使用する PnP PowerShell のコマンドは、Get-PnPListItemAttachment コマンドです。

https://pnp.github.io/powershell/cmdlets/Get-PnPListItemAttachments.html

Get-PnPListItemAttachment コマンドは、PnP Powershell の Ver 1.11.0 で追加されています。そのため、PnP Powershell を既に使用している場合でも、必要に応じてバージョンアップを行う必要があります。なお、Ver 1.11.0 でもコマンドがエラーとなる情報があったため、その場合は、1.12 以上を導入することで解消する可能性があります。

コマンドの利用方法

Get-PnPListItemAttachment コマンドは、ファイルをダウンロードするリストを指定してダウンロードします。最初に、Connect-PnPOnline コマンドでリストが存在するサイトに接続後に Get-PnPListItemAttachment コマンドを実行します。

Connect-PnPOnline -Url "サイト URL" -Interactive
Get-PnPListItemAttachment -List "リスト名" -Identity "リストアイテムの ID" -Path "保存先パス"

具体的には以下のような指定になります。

Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/siteXX" -Interactive
Get-PnPListItemAttachment -List "List001" -Identity 1 -Path C:\temp

留意事項

コマンド実行時のパラメータについて、Identity パラメータは必須指定です。
そのため、リストのすべての添付ファイルを取得する場合には、各アイテムの ID を指定する必要があります。

また、ダウンロードされるファイルは、アイテムに添付されているファイル名のまま、ダウンロードされます。
そのため、以下のような各リスト アイテムに同名のファイルが添付されている場合は、ダウンロード時に同一フォルダーにダウンロードした場合は、上書き (または上書きしない) 状態となり、アイテムごとのファイルは保存できません。

ファイルの上書きを避けて全ての添付ファイルをダウンロードする方法

上記の留意事項にあるような動作を受けて、全てのリスト アイテムから添付ファイルをダウンロードする場合は以下のような実装が実現できると思います。

$site = "https://contoso.sharepoint.com/sites/siteXX"
$list = "List001"
$path = "C:\Temp\"
$id = 0
$downloadPath = ""

Connect-PnPOnline -Url $site -Interactive

$listItems= (Get-PnPListItem -List $list)  
foreach($listItem in $listItems){  
 $id = $listItem["ID"]  
 $downloadPath =  $path + $ID 
 New-Item $downloadPath   -ItemType Directory
 Get-PnPListItemAttachment -List $list -Identity $id -Path $downloadPath
}  

実装を簡単に説明すると、アイテム ID の情報を含むすべてのアイテムの取得を Get-PnPListItem コマンドで行い、取得結果の件数分ループを行います。
ループの中で、アイテムごとに添付ファイルをダウンロード先のフォルダーを作成し、そこにファイルをダウンロードします。

なお、 Get-PnPListItemAttachment コマンドはリスト アイテムに添付ファイルがない場合にもエラーとはなりませんが、上記の実装では、ファイルの有無に関わらずフォルダーは作成される動作になるので、添付ファイルの有無を確認してフォルダーを作成するかどうかを判断するロジックを入れても良いと思います。

Discussion