繰返し処理に時間が掛かる場合、強制終了せずに途中正常に中止させる方法

PowerShell Script

繰り返し処理毎にcancel.txtファイルの存在を監視し、存在したら繰り返し処理から抜け出すサンプルPowerShellスクリプトを作成してみました。(監視するファイル名は決め事です。なんでもいいです。)

まず、以下の3つファイルを用意します。

C:\temp\sample> dir /b
cancel.txt_
test.csv
test.ps1

cancel.txt_

アンダースコア「_」の記号付きのcancel.txt_ファイルを作成します。繰り返し処理中にファイル名からアンダースコアを削除したら処理が中止する仕組みです。

test.csv

以下の内容(プログラムコマンドと引数)をコンマ「,」区切りでtest.csvファイルに保存します。テストのために全てを同じ実行コマンドにしてあります。コマンド「TIMEOUT /T 秒数」は、指定した時間(単位:秒)だけ処理を一時停止するために使用されます。ここでは10秒、15秒、20秒...のよう5秒ずつ一時停止時間を増やしてあります。

TIMEOUT,/T,10
TIMEOUT,/T,15
TIMEOUT,/T,20
TIMEOUT,/T,25
TIMEOUT,/T,30
TIMEOUT,/T,35
TIMEOUT,/T,40

test.ps1

以下のPowerShellスクリプトをtest.ps1ファイルに保存します。詳細について各行の説明コメントを見て理解してください。

## スクリプトの実行場所をスクリプトが存在するディレクトリに設定するためのコマンド
## $PSScriptRootは、スクリプトが格納されているディレクトリのパスを表す
Set-Location -Path $PSScriptRoot

$csvFile = "test.csv"
$cancelFile = "cancel.txt"
Write-Host "処理を開始します。途中、処理を中止したい場合、"
Write-Host "空きファイル$($cancelFile)を作成してください。"
Write-Host ""

## CSVファイルを行ごとに読み込み、各行に対して処理を行う
foreach ($line in Get-Content $csvFile) {
    #読み込んだ行をカンマで分割し、配列$itemsに格納
    $items = $line -split ","
    $execFileName=$items[0].Trim('"')
    $arg1=$items[1].Trim('"')
    $arg2=$items[2].Trim('"')

    # コマンドの文字列を作成 
    $cmd = "$($execFileName) $($arg1) $($arg2) "

    #処理の中止チェック
    if (Test-Path $cancelFile) {
        Write-Host "$($cancelFile)ファイルにより、繰り返し処理を中止します。"
        break
    }
    Write-Host  $cmd 
  # コマンドの文字列を実行します。
    Invoke-Expression $cmd 
    Write-Host
}
Read-Host "Press Enter to exit:"

ps1スクリプト実行

.ps1拡張子はPowerShellで書かれたスクリプトを表します。test.ps1ファイルをマウスでダブルクリックするかコマンドプロンプトにpowershell test.ps1を実行するとファイルに書かれているスクリプトが実行されます。待ち続けるとtest.csvに定義されている7行あるTIMEOUTプログラムがすべて実行されますが、処理途中にcancel.txt_ファイル名をcancel.txtに変更することで次のTIMEOUTプログラムを実行する前にforeach文の繰り返しから抜け出します。結果は以下ようになります。

処理を開始します。途中、処理を中止したい場合、
空きファイルcancel.txtを作成してください。
TIMEOUT /T 10 
10 秒待っています。続行するには何かキーを押してください ...
TIMEOUT /T 15 
15 秒待っています。続行するには何かキーを押してください ...
cancel.txtファイルにより、繰り返し処理を中止します。
Press Enter to exit:

まとめ

処理時間が長いプログラムを大量に実行し終了まで複数日に跨る場合、リソースの問題で営業時間内の実行は避けたくなると思います。そのため、中止と再実行が必要になります。中止する際にCtrl + Cを押して強制終了することもできますが、プログラムの実行中の強制終了は推奨しません。上記のサンプルのように繰り返し処理の先頭で中止ファイルを監視し、存在すればスクリプト中止させるロジックを追加することで正常な中止を行うことができます。再実行する際には前回実行したcsvファイルの行(プログラムコマンド)を消す必要があります。さもないと2回実行されることになりますので注意が必要です。

タイトルとURLをコピーしました