はじめに
今回の記事では、Windowsのタスクスケジューラで祝日など特定の日付を判定する方法を紹介します。
タスクスケジューラはプログラムを実行する曜日を指定することで、平日のみ実行させるなどの処理は可能ですが、祝日などを判定する機能は備わっていません。
そのため、営業日のみ実施させたいプログラムがある場合には手動でスケジュールを止める必要があり非常に面倒です。
上記のような課題を解決するため、今回は祝日が記載されたcsvファイルとPowerShellスクリプトに祝日を判定する処理を追加することで解決を図ります。
今回の流れ
今回の大まかな流れは以下のようになります。
- 内閣府のサイトから国民の祝日が記載された[syukujitsu.csv]をダウンロード
- [syukujitsu.csv]をBOM付きUTF-8で保存し直す
- [syukujitsu.csv]をスクリプトと同じフォルダに保存
- PowerShellスクリプトに[syukujitsu.csv]を読み込んで祝日か判定する処理を追加する
作成手順
[syukujitsu.csv]をダウンロード
まずは内閣府のサイトから国民の祝日が記載された[syukujitsu.csv]をダウンロードします。
※クリックするとcsvファイルがダウンロードされます。
[syukujitsu.csv]をBOM付きUTF-8で保存し直す
文字化け対策のため、以下の手順で[syukujitsu.csv]をBOM付きUTF-8で保存します。
- csvファイルをテキストファイルなどで開く(※ファイルを右クリック > [プログラムから開く] > [メモ帳] を選択)
- [ファイル] > [名前を付けて保存]をクリック
- エンコードでUTF-8(BOM付き)をクリックして保存
BOM付きUTF-8ファイルでは、ファイルの先頭にBOM(Byte Order Mark)が存在します。BOMとはファイルがどのエンコーディング形式で書かれているかを示すために使用されます。
このBOMがあることで、テキストエディタやプログラムがファイルを開いた際に、自動的にそのファイルがUTF-8でエンコードされていることを認識できます。これにより、適切なエンコーディングでテキストを解釈し、文字化けを防ぐことができます。
[syukujitsu.csv]をスクリプトと同じフォルダに保存
[syukujitsu.csv]をタスクスケジューラで実行したいPowerShellスクリプト(拡張子がps1ファイル)と同じフォルダに保存します。
[syukujitsu.csv]を編集
[syukujitsu.csv]には1955年からの祝日が記載されているため、必要に応じて直近までの祝日は削除しておきます。最初の行(ヘッダー)は削除しないように注意してください。
また、年末年始などは祝日には入っていないため、必要に応じて行を追加しておきます。
PowerShellスクリプトに処理を追加する
実行するPowerShellスクリプトの最初に以下を追記します。
function IsHoliday {
param([string]$csvPath)
# CSVファイルを読み込む(列名を使用)
$holidays = Import-Csv -Path $csvPath
$today = Get-Date -Format "yyyy/MM/dd"
# 新しい列名を使用して祝日チェック
$holidayToday = $holidays | Where-Object { $_."国民の祝日・休日月日" -eq $today }
if ($holidayToday) {
Write-Host "本日は祝日です: $($holidayToday."国民の祝日・休日月日")"
}
return $holidayToday -ne $null
}
# 祝日チェック関数を呼び出す
$syukujitsuPath = Join-Path $PSScriptRoot "syukujitsu.csv"
if (IsHoliday -csvPath $syukujitsuPath) {
Write-Host "今日は祝日です。スクリプトは実行されません。"
exit
}
おわりに
今回の記事ではPowerShellの場合の、タスクスケジューラで祝日を判定する方法を紹介しました。タスクスケジューラの機能では祝日を判断することはできないため、スクリプトの中身で祝日を判断させる処理を追加することで機能を実装しました。
[syukujitsu.csv]に祝日だけではなく非営業日を追加することで指定した日付にスクリプトを動作させないことが可能になります。
要望があれば他の言語でのコードも追記しますので、お気軽にお問い合わせください。