SharePoint Online のドキュメントライブラリは自動的にバージョン管理が行われるため、長期間運用すると容量が急増しがちです。以前の記事ではライブラリ単位で日付指定のバージョン削除手順を解説しましたが、「特定フォルダー配下だけ」 に絞って再帰的にバージョンを削除したいニーズも増えています。

本稿では、PowerShell(PnP.PowerShell)を使い、指定フォルダー(サブフォルダー含む最深階層まで)の 30 日より古いバージョン を一括削除する手順をステップバイステップで紹介します。


想定読者

  • SharePoint Online の容量不足に悩んでいる
  • ライブラリではなく特定フォルダーだけバージョンを削除したい
  • PowerShell で自動化したい

前提条件

要件内容リンク
PowerShell 7.x 以上最新版をインストールhttps://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5#installing-the-msi-package
PnP.PowerShell モジュールSharePoint 操作用Install-Module PnP.PowerShell -Force
PnP PowerShellアプリEntra ID 上のPnP専用アプリ
SharePoint 編集権限対象サイトのサイトコレクション管理者権限

手順

PowerShell 7.x のインストール

Microsoft の公式ドキュメントから手順に従いインストールMSI パッケージのインストール

PnP.PowerShell の導入

以下コマンドをPowerShellで実行します。

Install-Module PnP.PowerShell -Force

PnPアプリの作成

テナントに対して、PnP PowerShell 用の「身分証(アプリ)」を作成・登録します。

2024年9月のセキュリティ仕様変更により、従来の -UseWebLogin パラメータは使用できなくなりました。現在は、初回に「専用アプリ」をテナントに登録し、発行された Client ID を使って接続する方法が推奨されています。

以下コマンドをPowerShellで実行します。

Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "PnP PowerShell"

Tenant: と聞かれたら、テナントドメイン(xxx.onmicrosoft.com)を入力します。

cmdlet Register-PnPEntraIDAppForInteractiveLogin at command pipeline position 1
Supply values for the following parameters:
Tenant: xxx.onmicrosoft.com

ブラウザが起動するので、全体管理者アカウントでログインします。

PowerShell 画面に Client ID が表示されます。これを必ず保存してください。

スクリプトの作成

以下を Remove-OldVersions.ps1 として保存。各パラメーター(接続先サイト、ClientIdフォルダのサイト相対パス、何日より古いバージョンを削除するか)は実行前に必ず修正してください。

# 作成したアプリの ID を指定して SharePoint に接続します。従来のUseWebLogin の代わりにInteractiveを使用します。
Connect-PnPOnline -Url "https://yourtenant.sharepoint.com/sites/SITENAME" -Interactive -ClientId "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# 設定
$FolderUrl = "Shared Documents/親フォルダ/子フォルダ"    # フォルダのサイト相対パス
$Cutoff    = (Get-Date).AddDays(-30)    # 何日より古いバージョンを削除するか。本パラメーターは30日

# フォルダー配下の全ファイルを再帰取得して古いバージョンを削除
Get-PnPFileInFolder -FolderSiteRelativeUrl $FolderUrl -Recurse -ExcludeSystemFolders |
ForEach-Object {
    $ctx  = Get-PnPContext
    $file = $ctx.Web.GetFileByServerRelativeUrl($_.ServerRelativeUrl)
    $ctx.Load($file); $ctx.Load($file.Versions); $ctx.ExecuteQuery()

    $old = @($file.Versions | Where { $_.Created -lt $Cutoff })
    if ($old.Count -gt 0) {
        $old | ForEach-Object { $_.DeleteObject() }
        $ctx.ExecuteQuery()
        Write-Host "Deleted $($old.Count) versions → $($_.ServerRelativeUrl)"
    }
}

スクリプトの実行

PowerShell 7.を起動し、Remove-OldVersions.ps1 が保存されているディレクトリへ移動して以下コマンドを実行

.\Remove-OldVersions.ps1

実行後の確認

  • 対象フォルダ内のファイルバージョン履歴が削除されていること
  • SharePoint 管理センターの容量レポートでストレージ使用量が減少していること ※反映には1日程度かかります

注意事項

  • 実行前に必ずテスト環境で検証をおこなってください
  • 大量ファイル時は実行時間が長くなる可能性があります

Microsoft 365に関するご相談やお悩みがございましたら、ぜひ株式会社WITHWITまでお気軽にお問い合わせください。
数あるクラウドサービスの中でMicrosoft 365 に特化してきたからこそ導入前から導入後の定着に至るまで、幅広いご相談に対応いたします。