リジューム機能を付けよう(CSOMでの場合)

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
タイトルとURLをコピーしました