はじめに
ドキュメントライブラリに保存されている共有ファイルを間違えて削除してしまったなんてことはありませんか?ゴミ箱が用意されているので、ゴミ箱に残っている間であれば復元可能ではありますが、93日間経過したファイルは完全削除されてしまいます。昨今流行っているランサムウェアによる被害を復元したい場合もあると思います。
この記事では、バックアップツールを利用せずに、特定のドキュメントライブラリからファイルをエクスポートする方法をご紹介します。

動作環境
本処理には、下記の環境条件を整える必要があります。
- Powershellバージョン7以上
- PnPOnlinePowershellモジュールのインストール
- Entra IDへのアプリケーション登録
- ダウンロード対象となるドキュメントライブラリへのアクセス権
環境整備
Powershellバージョン7.xのインストール
こちらのサイトからパッケージをダウンロードしてインストールします。
Powershell7.4は「ProgramFiles\PowerShell\7」にインストールされます。
PnPOnlineのインストールとアップデート
Powershellを起動して、以下のコマンドを実行してインストールを行います。
#新規インストール Install-Module -Name PnP.PowerShell #アップデート Update-Module -Name PnP.PowerShell
Entra IDへのアプリケーション登録
Powershellを起動して、以下のコマンドを実行してアプリケーションを登録します。ここで登録されたアプリケーションのIDはPnPOnlineへのログイン時に必要になりますので控えておいてください。
Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "<任意の名前>" -Tenant [契約ドメイン].onmicrosoft.com -Interactive
登録操作実施に確認可能ですが、以下の場所で後程確認も可能です。
- Entra IDの管理センターにログイン
- [アプリケーション]-[エンタープライズアプリケーション]を開く
- 上記で作成されたアプリケーション名をクリック
- プロパティ欄のアプリケーションIDを確認(またはコピー)

スクリプトの実行
事前に環境に合わせて変数に値を設定してください。
| 設定変数 | 記載内容 | 備考 |
|---|---|---|
| $userName | SPOサイトにアクセスするユーザーアカウント名 | 対象サイトのアクセス権が必要です。 |
| $userPassword | 上記アカウントのパスワード | |
| $siteURL | 移行対象のドキュメントライブラリが配置されているサイトURL | |
| $FolderSiteRelativeURL | ドキュメントライブラリ名 | サイト作成時にデフォルト作成されるライブラリはShared Documents |
| $destinationFolder | ダウンロード先のローカルパス |
ドキュメントライブラリ名はドキュメントライブライを開いたURLの以下の部分になります。
https://<契約ドメイン>.sharepoint.com/sites/<サイト名>/<ドキュメントライブラリ名>/Forms/AllItems.aspx
変数に必要な情報を登録したら以下のスクリプトを実行します。本作業で必要になるコマンドは「Get-PnPFolderItem」です。
下記スクリプトの14行目で指定するドキュメントライブラリ名を「/<ドキュメントライブラリ名>/<フォルダ名>」にすることでドキュメントライブラリルート以外のフォルダから下をすべてダウンロードすることも可能です。
# SharePointへのアクセス情報
$userName = "<SPOサイトにアクセス権のあるユーザーアカウント名>"
$userPassword = "<パスワード>"
$secPasswd = ConvertTo-SecureString $userPassword -AsPlainText -Force
# 移行対象のドキュメントライブラリが配置されているサイト情報
$siteURL = "https://<契約ドメイン>.sharepoint.com/sites/<サイト名>/"
[System.Management.Automation.PSCredential]$PSCredentials = New-Object System.Management.Automation.PSCredential($userName, $secPasswd)
# PnPでSharePoint Onlineに接続する(ClientIdはEntra IDで追加したアプリケーションのアプリケーションID)
Connect-PnPOnline -Url $siteURL -Credentials $PSCredentials -ClientId <アプリケーションID>
# ファイルの取得元ライブラリを指定
$FolderSiteRelativeURL = "/<ドキュメントライブラリ名>"
$destinationFolder ="<エクスポート先のフォルダパス>"
# 配下のフォルダ全部の情報を取得
$folderColl = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -Recursive -ItemType Folder
# フォルダを順番にチェック
foreach($folder in $folderColl)
{
# フォルダパスの取得
$subFolderURL = $folder.ServerRelativeUrl.Substring($folder.Context.Web.ServerRelativeUrl.Length)
# URLをローカルパスに変換
$localFolder = $destinationFolder + ($subFolderURL -replace "/","\")
# ローカルにフォルダがなければ作成する処理
if( -not (Test-Path $localFolder))
{
New-Item -Path $localFolder -ItemType "directory"
}
# ファイルのダウンロード処理
$filesColl = Get-PnPFolderItem -FolderSiteRelativeUrl $subFolderURL -ItemType File
Foreach($File in $filesColl)
{
Get-PnPFile -ServerRelativeUrl $File.ServerRelativeUrl -Path $localFolder -FileName $File.Name -AsFile -force
}
}
まとめ
本記事でご紹介したスクリプトでは、ドキュメントライブラリのフォルダ構造を含めてダウンロードする仕様としてみました。せっかくクラウドに保存したデータをわざわざローカルに落としてどうするんだとかはあるのですが、バックアップツールはなかなかの高額なツールとなっておりますので、そんなに簡単に導入できるものではないようです。
弊社でテストした時は特に問題はありませんでしたが、大規模なドキュメントライブラリからファイルダウンロードする際は、スロットリングに抵触する可能性がありますので、小規模なライブラリからお試しいただきますようお願いいたします。
