SANANEBLOG
Microsoft PR

【PowerShell】タスクスケジューラで祝日を判定する方法!特定の日に実行させない方法を解説

記事内に商品プロモーションを含む場合があります

はじめに

今回の記事では、Windowsのタスクスケジューラで祝日など特定の日付を判定する方法を紹介します。

タスクスケジューラはプログラムを実行する曜日を指定することで、平日のみ実行させるなどの処理は可能ですが、祝日などを判定する機能は備わっていません

SANANE

そのため、営業日のみ実施させたいプログラムがある場合には手動でスケジュールを止める必要があり非常に面倒です。

上記のような課題を解決するため、今回は祝日が記載されたcsvファイルとPowerShellスクリプトに祝日を判定する処理を追加することで解決を図ります。

今回の流れ

今回の大まかな流れは以下のようになります。

  1. 内閣府のサイトから国民の祝日が記載された[syukujitsu.csv]をダウンロード
  2. [syukujitsu.csv]をBOM付きUTF-8で保存し直す
  3. [syukujitsu.csv]をスクリプトと同じフォルダに保存
  4. PowerShellスクリプトに[syukujitsu.csv]を読み込んで祝日か判定する処理を追加する

作成手順

[syukujitsu.csv]をダウンロード

まずは内閣府のサイトから国民の祝日が記載された[syukujitsu.csv]をダウンロードします。

※クリックするとcsvファイルがダウンロードされます。

[syukujitsu.csv]をBOM付きUTF-8で保存し直す

文字化け対策のため、以下の手順で[syukujitsu.csv]をBOM付きUTF-8で保存します。

  1. csvファイルをテキストファイルなどで開く(※ファイルを右クリック > [プログラムから開く] > [メモ帳] を選択)
  2. [ファイル] > [名前を付けて保存]をクリック
  3. エンコードでUTF-8(BOM付き)をクリックして保存

[syukujitsu.csv]をスクリプトと同じフォルダに保存

[syukujitsu.csv]をタスクスケジューラで実行したいPowerShellスクリプト(拡張子がps1ファイル)と同じフォルダに保存します。

[syukujitsu.csv]を編集

[syukujitsu.csv]には1955年からの祝日が記載されているため、必要に応じて直近までの祝日は削除しておきます。最初の行(ヘッダー)は削除しないように注意してください。

また、年末年始などは祝日には入っていないため、必要に応じて行を追加しておきます。

翌年以降の祝日は[syukujitsu.csv]に記載されていない場合があるため、手動で追加するか内閣府のサイトが更新され次第新しいファイルを差し替える必要があります。

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
}

このスクリプトは、以下のような処理となっています。

  1. [syukujitsu.csv]を読み込む
  2. 本日の日付を取得する
  3. 本日の日付と[syukujitsu.csv]を比較し一致するとプログラムが終了する
  4. 一致しない場合はそのまま処理を続行する

おわりに

今回の記事ではPowerShellの場合の、タスクスケジューラで祝日を判定する方法を紹介しました。タスクスケジューラの機能では祝日を判断することはできないため、スクリプトの中身で祝日を判断させる処理を追加することで機能を実装しました。

[syukujitsu.csv]に祝日だけではなく非営業日を追加することで指定した日付にスクリプトを動作させないことが可能になります。

要望があれば他の言語でのコードも追記しますので、お気軽にお問い合わせください。