1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

# PowerShellで今年度の平日Markdownファイルを自動生成(祝日除外)

Posted at

はじめに

日々のメモや日報、Markdown日記などで「毎日の空ファイル」を作っている方に向けて、
今年度(4/1〜翌年3/31)の平日だけ、しかも祝日を除外して自動生成するPowerShellスクリプトを作りました。

出力は 年/年月/yyyyMMdd.md という階層で、例えば次のように作られます。


出力イメージ

D:\Notes
├─ 2025
│ ├─ 202504
│ │ ├─ 20250401.md
│ │ ├─ 20250402.md
│ │ ...
│ ├─ 202505
│ │ ├─ 20250501.md
│ │ ...

※上図は例です。祝日・土日は生成されません。


スクリプトの機能

  • 今年度の平日だけを対象に空の .md ファイルを作成
  • 年/年月のフォルダ階層を自動生成
  • 内閣府公開の祝日CSV を自動取得
    (取得できない場合はローカルCSVを指定可能)
  • 既存ファイルがあれば上書きせずスキップ
  • -WhatIf オプションで作成予定だけ確認可能

スクリプト本体

<#
.SYNOPSIS
  今年度の平日だけ、年/年月/yyyymmdd.md(空)を作成する。

.PARAMETER RootDir
  生成先のルートフォルダ(必須)

.PARAMETER HolidayCsvPath
  祝日CSV(内閣府フォーマット)をローカル指定する場合に使用(任意)

.PARAMETER WhatIf
  作成予定のみを表示(任意)
#>

[CmdletBinding(SupportsShouldProcess=$true)]
param(
  [Parameter(Mandatory=$true)]
  [string]$RootDir,

  [string]$HolidayCsvPath
)

function Get-JPHolidays {
  param(
    [datetime]$StartDate,
    [datetime]$EndDate,
    [string]$CsvPath
  )

  # 祝日CSVを取得(新旧ファイル名に対応)
  $csvText = $null
  if ($CsvPath -and (Test-Path $CsvPath)) {
    $csvText = Get-Content -Path $CsvPath -Raw
  } else {
    $urls = @(
      'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv',
      'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv'
    )
    foreach ($u in $urls) {
      try {
        $resp = Invoke-WebRequest -Uri $u -UseBasicParsing -TimeoutSec 20
        if ($resp -and $resp.Content) { $csvText = $resp.Content; break }
      } catch { continue }
    }
    if (-not $csvText) {
      throw "祝日CSVの取得に失敗しました。-HolidayCsvPath でローカルCSVを指定してください。"
    }
  }

  # 日付抽出
  $lines = ($csvText -split "`r?`n") | Where-Object { $_ -match '^\s*\d{4}/\d{1,2}/\d{1,2},' }
  $set = New-Object 'System.Collections.Generic.HashSet[datetime]'
  foreach ($line in $lines) {
    $datePart = $line.Split(',')[0].Trim()
    try {
      $dt = [datetime]::ParseExact($datePart, 'yyyy/M/d', $null)
      if ($dt -ge $StartDate.Date -and $dt -le $EndDate.Date) {
        $null = $set.Add($dt.Date)
      }
    } catch { continue }
  }
  return $set
}

# 年度判定
$today = Get-Date
$fy = if ($today.Month -ge 4) { $today.Year } else { $today.Year - 1 }
$start = Get-Date -Year $fy -Month 4 -Day 1
$end   = Get-Date -Year ($fy + 1) -Month 3 -Day 31 -Hour 23 -Minute 59 -Second 59

# 祝日取得
$holidays = Get-JPHolidays -StartDate $start -EndDate $end -CsvPath $HolidayCsvPath

# 出力ルート作成
if (-not (Test-Path $RootDir)) {
  New-Item -ItemType Directory -Path $RootDir | Out-Null
}

# 平日のみ処理
for ($d = $start.Date; $d -le $end.Date; $d = $d.AddDays(1)) {
  if ($d.DayOfWeek -in @('Saturday', 'Sunday')) { continue }
  if ($holidays.Contains($d)) { continue }

  $yearDir = Join-Path $RootDir ($d.ToString('yyyy'))
  $ymDir   = Join-Path $yearDir ($d.ToString('yyyyMM'))
  $file    = Join-Path $ymDir   ($d.ToString('yyyyMMdd') + '.md')

  if (-not (Test-Path $ymDir)) {
    if ($PSCmdlet.ShouldProcess($ymDir, 'Create directory')) {
      New-Item -ItemType Directory -Path $ymDir -Force | Out-Null
    }
  }

  if (-not (Test-Path $file)) {
    if ($PSCmdlet.ShouldProcess($file, 'Create empty file')) {
      New-Item -ItemType File -Path $file -Force | Out-Null
    }
  }
}

Write-Host "完了:$($start.ToString('yyyy/MM/dd')) 〜 $($end.ToString('yyyy/MM/dd')) の平日(祝日除外)ファイルを作成しました。出力先:$RootDir"

実行例

# 公式CSV自動取得
.\Make-FYWeekdayNotes.ps1 -RootDir "D:\Notes"

# ローカルCSVを使う場合
.\Make-FYWeekdayNotes.ps1 -RootDir "D:\Notes" -HolidayCsvPath "C:\temp\shukujitsu.csv"

# ドライランで作成予定を確認
.\Make-FYWeekdayNotes.ps1 -RootDir "D:\Notes" -WhatIf

祝日CSVについて

  • 内閣府が毎年公開している祝日一覧を使用します
    shukujitsu.csv(新名称)
    syukujitsu.csv(旧名称)
  • CSVは yyyy/M/d,祝日名 の形式になっています。

応用

  • ファイル内容にテンプレートを挿入するよう改造すれば、日報や日記の雛形が毎日用意されます。
  • 対象年度を変更したい場合は $fy の部分を任意の値にすればOK。
  • Markdown以外の拡張子にも簡単に対応できます。

おわりに

このスクリプトがあれば、日々の記録作業がぐっと楽になります。
カレンダーに沿った自動ファイル生成は、開発ログや学習日誌、日報管理などにも便利です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?