それと「国民の祝日・休日」CSVファイルを使って、該当の日付が何の日かを判別する方法を記録しておこうと思います。
PowerShellで日付から曜日と祝日・休日を得る手順
日付は変数に入れておく
取り扱う日付ですが。このような感じで、ハッシュ変数に入れておきます。
$datehash=@{year=2024;month=5;day=3}
さらに、Get-Dateで取得したオブジェクトを、$date変数に入れておきます。
$date = Get-Date -year $datehash.year -month $datehash.month -day $datehash.day
$date
Get-Dateは時刻も表示されますが、今回使用するのは日付のみになります。
曜日の表示
普通にGet-Dateコマンドレットを使用するとこのような感じですが。
Get-Date `
-year $datehash.year -month $datehash.month -day $datehash.day `
-Format "yyyy-MM-dd ddd"
Get-Date `
-year $datehash.year -month $datehash.month -day $datehash.day `
-Format "yyyy-MM-dd dddd"
-Formatにて”ddd”なら「木」、”dddd”なら「木曜日」となるようです。
先ほど、$date変数にGet-Dateは入れておいたため、もっと簡単に。
$date |Get-Date -Format "ddd"
$date |Get-Date -Format "dddd"
$date.ToString("ddd")
$date.ToString("dddd")
日付を扱いたい場合は、Get-Dateで生成たオブジェクトを変数に入れたほうが利便性が高そうです。後で祝日・休日を探すときも、$date変数を使用しています。
祝日・休日一覧を変数に入れておく
次に祝日・休日の一覧ですが。こちらのCSVを使用させて頂きました。
画面中段のリンク「昭和30年(1955年)から令和7年(2025年)国民の祝日(csv形式:20KB)ファイル」を使用させて頂きました。
CSVファイルのダウンロードリンクを使用します。リンクをコピーして、下記の<CSVファイルへのリンク>の部分へ貼り付けて下さい。(リンクは変わる場合があるため都度行う
Invoke-WebRequest `
-URI <CSVファイルへのリンク> `
-OutFile syukujitsu.csv
$syukujitsu = Import-Csv .\syukujitsu.csv -Encoding Default
これで$syukujitsu変数に、CP932(Shift-JIS)ではなくUTF-8形式で国民の祝日・休日の一覧が格納されました。
余談ですが、他の方法はうまくいきませんでした。
- Invoke-WebRequestでファイルを保存(CP932)、Import-CsvでUTF-8に変換しながら読み込み→OK
- Invoke-WebRequestでファイルではなく変数へ格納 → NG
- Invoke-WebRequestからConvertFrom-CSVへパイプライン →NG
文字コードの変換が、どうもファイルから読み込むタイミングでしか行えない(ConvertFromは-Encodingオプションが使えない)感じでした。今回、Shift-JISのテキストを扱ったため、必ずファイルに保存してから、コンバートしながら読み込む手順が必要でした。
最初からUTF-8のテキストの場合は、ファイルに保存しなくても直接読み込めるかもしれません。余談でした。
休日・祝日の表示
$syukujitsu変数に入れたCSVファイルを使用して、該当日が休日・祝日であるか判別してみましょう。
$syukujitsu `
| Where-Object "国民の祝日・休日月日" `
-Match $date.ToString("yyyy/M/d")
CSVを入れた変数を対象に、-Matchで該当日のパターンを作り、Where-Objectで検索をかけています。
名称だけ取り出したい場合は。
$syukujitsu | Where-Object "国民の祝日・休日月日" `
-Match $date.ToString("yyyy/M/d"))."国民の祝日・休日名称"
列の名前をプロパティ名としてアクセスできる感じです。プロパティが日本語の場合でも、ダブルクォーテーションで囲めばアクセスできました。
ちなみに、検索の該当列の指定は、こちらを使用して判定しています。
$syukujitsu | Get-Member
CSVファイルの1行目がヘッダでしたが、NotePropertyとして扱われているため、「国民の祝日・休日名称」と「国民の祝日・休日月日」を列の名前として使用できました。
余談ですが、TypeName欄を見ますと、この変数は、内部的にはPSCustomObjectとして扱われているようです。PS=PowerShellを表しています。.NETの内部に、PowerShell専用のライブラリが用意されているようです。
このような感じで。
PowerShellを使用して、任意の日付から曜日とその日が何の日かを判別することができました。
PowerShellはWindowsに付属するため、どんなPCでも動かせると思います。
今回は変数を使いましたが。
CSVファイルを扱うような、複雑なコマンドレットでも、変数に入れてしまえば簡単に扱えることがわかりました。
さて。材料が揃ってきたところで、ぼちぼち、ドラレコで録画したファイルを、日付ごとに分類するコマンドを作ろうかと思います。
それではまたお会いしましょう。