PowerShell で1週間分の日報をまとめるための Markdown 形式テキストファイルを生成する
概要
- 業務で Markdown 形式の日報を書いている
- 振り返り作業のため、5日分の「やったこと」だけを抜き出してまとめた Markdown 形式の
.md
ファイルを毎週作成している - 日付の見出しを毎回手打ちするのがダルくなってきたので、PowerShell くんにバシッと一発で生成してもらいたい
- かつ、生成済みの場合は、該当のファイルをテキストエディタで開いてほしい
スクリプトの作成方法
ChatGPT-4 に以下の手順でやってもらった。
- Linux ベースの OS で動くシェルスクリプトを作ってもらう
- やりたいことを一部手直し
- 完成したシェルスクリプトを、Windows PowerShell 用に変換してもらう
- シェルスクリプトの保存方法・実行方法を教えてもらう
完成したスクリプト
# 今日の曜日を取得 (0:日曜日, 1:月曜日, ..., 6:土曜日)
$dayOfWeek = (Get-Date).DayOfWeek.value__
# 引数によってオフセットを調整
switch ($args[0]) {
"prev" {
if ($dayOfWeek -eq 0) {
$offset = -6
} elseif ($dayOfWeek -eq 1) {
$offset = -7
} else {
$offset = (1 - $dayOfWeek)
}
}
"next" {
if ($dayOfWeek -eq 0) {
$offset = 1
} elseif ($dayOfWeek -eq 1) {
$offset = 7
} else {
$offset = (8 - $dayOfWeek)
}
}
}
# 最初の日付と最後の日付を取得
$firstDay = (Get-Date).AddDays($offset)
$lastDay = $firstDay.AddDays(6)
# 保存先を定義
$saveDir = "C:\Users\hi3103\Data\shima\"
# ファイル名を定義
$filename = "{0}_{1}.md" -f $firstDay.ToString("yyyy-MM-dd"), $lastDay.ToString("yyyy-MM-dd")
# 保存先ファイルのフルパスを生成
$filepath = Join-Path -Path $saveDir -ChildPath $filename
# 作成したファイルが存在する場合は、既存のファイルを開く
if (Test-Path -Path $filepath) {
Invoke-Item $filepath
} else {
# ファイルを作成し、1行目にファイル名を出力
Set-Content -Path $filepath -Value $filename
# 2行目に空白行を挿入
Add-Content -Path $filepath -Value ""
# 指定した月曜日から日曜日までの日付を出力 (Markdown形式の見出し)
for ($i = 0; $i -le 6; $i++) {
$date = $firstDay.AddDays($i)
Add-Content -Path $filepath -Value "# $($date.ToString("yyyy-MM-dd"))"
}
# 作成したファイルを開く
Invoke-Item $filepath
}
実行方法・出力結果
PowerShell 用のスクリプトを nippo.sh
という名前で保存したと仮定。
手前の月曜日を1日目とする場合
引数 prev
を渡す。
PowerShell -ExecutionPolicy RemoteSigned -File nippo.ps1 prev
仮に 2023-06-13(火曜日)に実行した場合、以下が出力される。
2023-06-12_2023-06-18.md
# 2023-06-12
# 2023-06-13
# 2023-06-14
# 2023-06-15
# 2023-06-16
# 2023-06-17
# 2023-06-18
後ろの月曜日を1日目とする場合
引数 next
を渡す。
PowerShell -ExecutionPolicy RemoteSigned -File nippo.ps1 next
仮に 2023-06-13 (火曜日)に実行した場合、以下が出力される。
2023-06-19_2023-06-25.md
# 2023-06-19
# 2023-06-20
# 2023-06-21
# 2023-06-22
# 2023-06-23
# 2023-06-24
# 2023-06-25
実行コマンドを省略する
下記エントリーを応用し、PowerShell 用プロファイルにエイリアスを登録する。
引数の扱いについて
これも ChatGPT に教えてもらったところ、以下の回答を得た。
Set-Alias
コマンド自体では引数の設定をすることはできない- PowerShell 関数を作成すれば、引数を受け取るエイリアスを作ることができる
- PowerShell 関数は、直接プロファイルに書き込むことができる
プロファイルに追記するソース
# 日報まとめ作成用コマンド
function nippoVars {
# 引数の設定
param(
[Parameter(Mandatory=$false, Position=0)]
[string]$Arg
)
# 引数が設定されている場合、'prev' または 'next' でない場合は処理を停止
if ($Arg -and $Arg -notin @('prev', 'next')) {
Write-Host "Invalid argument: $Arg. Expected 'prev' or 'next'."
return
}
# スクリプトファイルをフルパスで指定
$scriptPath = "C:\Users\hi3103\Data\shima\nippo.ps1"
# スクリプトを実行
PowerShell -ExecutionPolicy RemoteSigned -File $scriptPath $Arg
}
Set-Alias -Name nippo -Value nippoVars
実行コマンド
以下いずれかで実行可能。
nippo
nippo prev
nippo next
関連リファレンス
- シェル環境のカスタマイズ – PowerShell | Microsoft Learn
- プロファイルについて – PowerShell | Microsoft Learn
- 関数について – PowerShell | Microsoft Learn
更新履歴
- 2023-06-13 公開
- 2024-01-28 ソース修正。引数の処理がうまくいってなかったので直した。