OneDriveで同期したドキュメントライブラリをバックアップするスクリプト

領収書や交通費の記録などの仕事上重要な書類をSharePoint Online上に保存しています。

OneDriveでローカルのフォルダと同期は取ってありますが、常に最新の断面しかないし、間違ってローカルからファイルを消すと戻せなくなるのでスクリプトを作ってみました。

全体仕様

保存対象:「あるSharePoint Onlineサイトにあるドキュメントライブラリ」

保存先:「ローカルのバックアップ用フォルダ」と「SharePoint Onlineの別のサイトに作ったバックアップ用ドキュメントライブラリ」

全体の流れ:

  1. 保存対象をOneDriveでローカルに同期する設定にしておく
  2. PowerShellのスクリプトを作成(保存対象をzipにまとめて「ローカルのバックアップフォルダ」と「バックアップ用ドキュメントライブラリを同期したフォルダ」にコピー
  3. (上にも書いたとおり)バックアップ用ドキュメントライブラリもローカルに同期する設定にしておく

このスクリプトをタスクスケジューラで定期実行します(週1程度)。

zipファイルは末尾に年月日(_yyyyMMdd)をつけて複数世代を持つ。

スクリプトの実装

呼び出しコマンドは

  1. 保存対象ライブラリ同期先(ローカル)のパス
  2. バックアップ用ドキュメントライブラリ同期先(ローカル)のパス
  3. ローカルのバックアップ先

として、以下のようになります(数字部分は上記のパスで置き換え)。

「スクリプトパス(.ps1)  1 2 3」

実装上の注意点として、OneDriveで同期したフォルダにはいつもロックがかかっている、「.」で始まるファイルが有ってコピーの邪魔になるので除外しています。

Param(
    [Parameter(Mandatory=$True)]
    [string]$sourceFolderPath,      # コピーするフォルダ
    [Parameter(Mandatory=$True)]
    [string]$targetFolderPath,      # 圧縮されたzipファイルを最終的に格納する先
    [Parameter(Mandatory=$True)]
    [string]$workFolderPath         # コピー/圧縮の作業フォルダ。またローカル用の保存先でもある。
)

## 入力チェック
# 全てフォルダであること
if (!(Test-Path $sourceFolderPath -pathType container) -Or 
    !(Test-Path $targetFolderPath -pathType container) -Or
    !(Test-Path $workFolderPath -pathType container)) {
    Write-Host "パラメータには、フォルダパスを指定してください"
    exit   
}

# ファイル名を作成する(コピー元フォルダ名+日付)
$filename = $workFolderPath + "\" + (Split-Path $sourceFolderPath -Leaf) + "_" + (Get-Date -format yyyyMMdd) + ".zip"
Write-Host $filename

# ファイルの一時保管場所を用意
$tempFolderPath = $workFolderPath + "\temp"
if (Test-Path $tempFolderPath) {    # フォルダが既存なので中身を空にする
    Remove-Item ($tempFolderPath + "\*") -recurse
} else {
    New-Item $tempFolderPath -type directory
}

## zipファイルを作成する
# 作業用フォルダにコピーする(先頭に「.」がついたファイルがフォルダルートで常時ロックされるので除外する)
Copy-Item $sourceFolderPath $tempFolderPath -recurse -exclude @(".*", "*.url")

# zipファイルを作成する
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal   # 最適化
[System.IO.Compression.ZipFile]::CreateFromDirectory($tempFolderPath,
    $filename, $compressionLevel, $false)
    
# 作成したzipファイルを同期された方のバックアップフォルダにコピーする
Copy-Item $filename $targetFolderPath

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. t.shibata より:

    Office 365 Business Premium を契約しているならば OneDrive for Business (OD4B) が使えるのではないでしょうか。
    OD4B ならバージョン管理ができますよ。同期ツールもあります。

    • jyunji.watanabe より:

      Office365にログインして左上メニューで確認するとOneDriveがありますね。
      これがOneDrive for Businessですよね。仕事で使っているドキュメントなので、こっちに統合した方がいいかもしれませんね。情報ありがとうございます。

      OneDrive for Business→SharePointはFlowのテンプレートがあるみたいなので、OneDrive for Businessをメインに、SharePointをバックアップにしてもいいですね。

  2. t.shibata より:

    左上のアプリパネルから遷移した先が OneDrive for Business ですね。
    同期ツールのアイコンが青色の雲マークになります。(個人アカウントの OneDrive を同期させたときは白色の雲マークです。)
    OneDrive は既定だと 1GB しか容量がなかったと思いますが、OneDrive for Business なら既定で 1TB くらいまであったと思います。

    OneDrive for Business は基板が SharePoint のドキュメントライブラリなので CSOM などからファイル操作などが可能です。

    Flow いいですね。色々とテンプレートが充実してるらしいので使ってみたいですね。