はじめに
日々のメモや日報、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以外の拡張子にも簡単に対応できます。
おわりに
このスクリプトがあれば、日々の記録作業がぐっと楽になります。
カレンダーに沿った自動ファイル生成は、開発ログや学習日誌、日報管理などにも便利です。