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 用プロファイルにエイリアスを登録する。

Windows Powershell で擬似的に open コマンドを使えるようにする – hi3103の備忘録

引数の扱いについて

これも 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

関連リファレンス

更新履歴

  • 2023-06-13 公開
  • 2024-01-28 ソース修正。引数の処理がうまくいってなかったので直した。

Comments

  • スパム対策のため、コメント本文にURLが含まれている場合は「承認待ち」となり、すぐに投稿が反映されません。ご了承ください。
  • 公序良俗に反する内容、個人が特定できる情報、スパム投稿と思われるコメント等については、予告なく編集・削除する場合があります。