それにしても暑い。昨年作った天気・気温PS1を久しぶりに稼働するとこの有り様である。

  • 猛暑の予感・・・

    猛暑の予感・・・

昨年の暑さは尋常ではなく、迂闊に水分/塩分補給を怠り、冷房装置を切って眠った日の翌日の朝は、フラフラである。労働安全衛生規則の改正により熱中症対策の一部を罰則付きで義務化するなど、対策も進められている昨今である。今年は、比較的穏やかであると事前情報を得て安心していたところだが、ここ最近の状況は話と違うぞと警戒を強めたところである。

前回、プロンプトをPowerShellの機能だけでカスタマイズすることを覚えた筆者。PowerShellプロファイルには(Get-Location).Pathでの現在ディレクトリの位置情報、(ls).Countでの総ファイル数やユーザー情報、日時を取得表示。function SetPrompt関数でのメモ機能を残してマージさせている。

function SetPrompt {
    param($Text)
        $global:PromptText = $Text
}

function prompt {

    # リアルタイム取得
    $C = (Get-Location).Path
    $U = $env:USERNAME
    $F = (ls).Count
    $T = (Get-Date -Format "HH:mm")
    $D = (Get-Date -Format "yyyy/MM/dd")
    # リアルタイム記号列
    $Realtime = "File:$F / $C / U:$U / T:$T / D:$D /"

    # SetPrompt で設定した固定パート
    $Fixed = $global:PromptText

    # 合成して返す
    return "$Fixed $Realtime > "
}

  • デフォルト表示状態

    デフォルト表示状態

  • SetPromptでメモ入力

    SetPromptでメモ入力

  • メモ表示状態

    メモ表示状態

気象情報を追加する

この猛暑警戒シーズンである。ここに気象情報を追加したいところだ。さしあたり過去のOpenWhether APIから取得する.ps1は稼働中なので改めて、構造を見ると

while ($true) {
    $apiKey = $env:OPENWEATHER_API_KEY

    # 文京区(おおよその緯度経度)
    $lat = 35.717
    $lon = 139.753

    $uri = "https://api.openweathermap.org/data/2.5/weather?lat=$lat&lon=$lon&appid=$apiKey&units=metric&lang=ja"
    $res = Invoke-RestMethod -Uri $uri -Method Get

    $date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"    
    $temp = [double]$res.main.temp
    $iconCode = $res.weather[0].icon

    $iconMap = @{
        "01d" = "☀"
        "01n" = "🌙"
        "02d" = "🌤"
        "02n" = "🌥"
        "03d" = "☁"
        "03n" = "☁"
        "04d" = "☁"
        "04n" = "☁"
        "09d" = "🌧"
        "09n" = "🌧"
        "10d" = "🌦"
        "10n" = "🌦"
        "11d" = "🌩"
        "11n" = "🌩"
        "13d" = "❄"
        "13n" = "❄"
        "50d" = "🌫"
        "50n" = "🌫"
}
    $emoji = $iconMap[$iconCode]
    $color = switch ($temp) {
        { $_ -ge 38 } { 'Red'; break }
        { $_ -ge 33 } { 'Yellow'; break }
        { $_ -le 32 } { 'Blue'; break }
        default       { 'White' }
    }

    $msg = "東京都文京区の現在の気温: {0:N1}°C({1} )" -f $temp, $emoji
    Write-Host "$date $msg" -ForegroundColor $color

    $log = "$date $msg"
    Out-File -FilePath "log.txt" -Append -InputObject $log

    for ($i = 300; $i -gt 0; $i--) {
        Write-Host "`r次の更新まで: $i 秒 " -NoNewline
        Start-Sleep -Seconds 1
    }

    Write-Host "`r更新中...                    "
}

log.txtに情報を書き出している。

  • log.txtの内容

    log.txtの内容

このlog.txtの最後の一行を取得する(Get-Content公式)Get-Content "C:\Users\user\OneDrive\デスクトップ\log.txt" -Tail 1する$Tempを加えて、表示させる。

function SetPrompt {
    param($Text)
        $global:PromptText = $Text
}

function prompt {

    # リアルタイム取得
    $C = (Get-Location).Path
    $U = $env:USERNAME
    $F = (ls).Count
    $T = (Get-Date -Format "HH:mm")
    $D = (Get-Date -Format "yyyy/MM/dd")
    $Temp = Get-Content "C:\Users\user\OneDrive\デスクトップ\log.txt" -Tail 1
    # リアルタイム記号列
    $Realtime = "File:$F / $C / U:$U / T:$T / D:$D / 気温:$Temp "

    # SetPrompt で設定した固定パート
    $Fixed = $global:PromptText

    # 合成して返す
    return "$Fixed $Realtime > "
}

  • notepad $PROFILE で開いたプロファイルに記述し、. $PROFILEで反映して実行

    notepad $PROFILE で開いたプロファイルに記述し、. $PROFILEで反映して実行

起動時に最新のlog.txtに更新しておく場合には、プロファイルにスクリプトを実行する& で記述しておく。実行後にCtrl+Cでキャンセルすればログだけ更新されるのでそれを表示させている。

function SetPrompt {
    param($Text)
        $global:PromptText = $Text
}

function prompt {

    # リアルタイム取得
    $C = (Get-Location).Path
    $U = $env:USERNAME
    $F = (ls).Count
    $T = (Get-Date -Format "HH:mm")
    $D = (Get-Date -Format "yyyy/MM/dd")
    $Temp = Get-Content "C:\Users\user\OneDrive\デスクトップ\log.txt" -Tail 1
    # リアルタイム記号列
    $Realtime = "File:$F / $C / U:$U / T:$T / D:$D / 気温:$Temp "

    # SetPrompt で設定した固定パート
    $Fixed = $global:PromptText

    # 合成して返す
    return "$Fixed $Realtime > "
}

& "C:\Users\user\OneDrive\デスクトップ\openWhether.ps1"

  • 更新された情報で読み込まれる

    更新された情報で読み込まれる

その後に更新する場合も、. $PROFILEで再読み込みすることで最新の気温情報を取得可能だ。

気象情報がプロンプト周りにあると、水分塩分補給の注意喚起にはもちろんよいし、デジタルに没頭している際にふと物理世界に頭を戻せる。ちょうど良いくらいの没頭具合を提供してくれるものだと感じだ。