CSOMでSharePointを対象にした処理を大量にしていた際に途中でエラー等で処理が正常に終了しなかったので、リジューム機能を付けることでその問題を回避しました。
そもそもリジューム機能とは?
リジューム(レジュームとも呼ばれる)機能は、簡単に言ってしまえば途中まで処理した位置から再開する機能のことです。
実際にリジューム機能を付ける
リジューム用のクラスを作成する
リジュームで使用するクラスを宣言しておく、今回は以下のクラスで作成しています
class SHAREPOINT_INFO {
[array] $COMPLETED_SITE_URL
[array] $COMPLETED_LIST_URL
[array] $COMPLETED_ITEM_ID
# サイトURL配列に追加
setSiteURL([string]$_siteURL) {
$this.COMPLETED_SITE_URL += $_siteURL
}
# サイトURL配列に対象のURLが存在するかのチェック
[bool]searchSiteURL([string]$_targetURL) {
if($this.COMPLETED_SITE_URL -contains $_targetURL) {
return $true
} else {
return $false
}
}
# サイトURL配列を初期化する
clearSiteURL() {
$this.COMPLETED_SITE_URL = @()
}
# リストURL配列に追加
setListURL([string]$_listURL) {
$this.COMPLETED_LIST_URL += $_listURL
}
# リストURL配列に対象のURLが存在するかチェック
[bool]searchListURL([string]$_targetURL) {
if($this.COMPLETED_LIST_URL -contains $_targetURL) {
return $true
} else {
return $false
}
}
# リストURL配列を初期化する
clearListURL() {
$this.COMPLETED_LIST_URL = @()
}
# ItemID配列を追加する
setItemID([string]$_id) {
$this.COMPLETED_ITEM_ID += $_id
}
# ItemID配列に対象のIDが存在するかチェック
[bool]searchItemID([string]$_targetID) {
if($this.COMPLETED_ITEM_ID -contains $_targetId) {
return $true
} else {
return $false
}
}
# ItemID配列を初期化する
clearItemID() {
$this.COMPLETED_ITEM_ID = @()
}
}
$SITE_INFO = New-Object SHAREPOINT_INFO
起動時の処理
プログラム起動時にリジューム用のファイルが存在するかをチェックし、ファイルがなかったらファイルを作成、ファイルがあったら内容を読み込むようにします
# 対象ファイルが存在する場合はファイル内のデータ読み込み
# 対象ファイルが存在しない場合はファイルを作成する
$OutPutPath = ".\OutPut\ResumeSystem.json"
if(Test-Path -Path $OutPutPath) {
$jsonData = Get-Content $Script:OutPutPath | ConvertFrom-Json
$SITE_INFO.COMPLETED_SITE_URL = $jsonData.COMPLETED_SITE_URL
$SITE_INFO.COMPLETED_LIST_URL = $jsonData.COMPLETED_LIST_URL
$SITE_INFO.COMPLETED_ITEM_ID = $jsonData.COMPLETED_ITEM_ID
} else {
New-Item -Path $Script:OutPutPath -ItemType File -Confirm:$false | Out-Null
}
処理が終わったものを追加する
例えば、リストに対して処理が終了した後に完了リストに追加します
# SYSTEM側で生成されており、いじらない方が良いものを除外
if(($LIST.IsCatalog -ne $true) -and ($LIST.IsPrivate -ne $true)) {
Write-Host $LIST.Title
# ListURLの作成
If ($CONTEXT.Web.ServerRelativeUrl -eq "/") {
$ListURL = $("{0}{1}" -f $CONTEXT.Web.Url, $LIST.RootFolder.ServerRelativeUrl)
}
else {
$ListURL = $("{0}{1}" -f $CONTEXT.Web.Url.Replace($CONTEXT.Web.ServerRelativeUrl, ''), $LIST.RootFolder.ServerRelativeUrl)
}
# 処理完了ListURLに含まれていなけば処理をする
if(-not $SITE_INFO.searchListURL($ListURL)) {
#
# リストに対して何かしらの処理を実施する
#
# データを登録し、書き出す
$SITE_INFO.setListURL($ListURL)
$SITE_INFO | ConvertTo-Json | Out-File $OutPutPath -Encoding utf8
}
}
処理が終わったコンテンツを初期化する
追加しても、そのサイト内のリストに対して処理がすべて終わったら、今度は削除する必要があります
foreach($LIST in $_LISTS) {
#
# リストに対しての処理
#
}
# リストの初期化
$SITE_INFO.clearListURL()
$SITE_INFO | ConvertTo-Json | Out-File $OutPutPath -Encoding utf8
リジューム用のファイルを削除する
全処理が完了したら、リジューム用として作成したファイルを削除します。削除しないと、再度同じスクリプトを実行した際に予期せぬ事態が発生しうるからです
Remove-Item $OutPutPath -Force -Confirm:$false
会社紹介
私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています
会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造
この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています
ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します
-
アドバンスド・ソリューション株式会社
アドバンスド・ソリューションは主にMicrosoft製品を使用して、企業の生産性向上に取り組んでいます。要件定義から導入 ...
サイトへ移動
-
お問い合わせ | アドバンスド・ソリューション株式会社
お問い合わせはこちら