ふと、自分は一日にどれくらいコンピュータの勉強をしているのだろうか?と疑問に思い、勉強用に使ってるWindows PCの起動時間を記録することにしました。
そういうフリーウェアは既にあるような気がしましたが、簡単そうなので自作してみました。
なおPowerShellは今回始めて触ります。
Google Form を作る
フォームには以下の項目を設けました。
- Time: 日付と時刻
- CsName: PCの名前
- OsName: OS名
- OsVersion: OSのバージョン
Timeは「日付」タイプを選択した後、「時刻を含める」で日付と時刻を記録できます。
さて、このフォームにPowerShellから回答をPostすることになるのですが、フォームの項目のIDは"Time" のようなリーダブルなものではなく、単純な"18764741" みたいなランダムな数値は割り振られます。
このIDを調べるには、そして「送信」ボタン横のメニューの事前入力したURLを取得からサンプル回答を作ります。
取得したURLには、フォームのIDと、各項目のIDが含まれます。
https://docs.google.com/forms/d/e/【FormのID】/viewform?usp=pp_url&entry.18764741=2022-08-27+12:34&entry.687203154=AAA&entry.1024557962=BBB&entry.257024779=CCC
PowerShellスクリプト
単純に現在時刻とPC情報をハッシュテーブルにして Invoke-WebRequest
でPOSTします。
# ComputerLog.ps1
$formId = "フォームのID"
function isError($response) {
$s = $response.StatusCode
return ($s -lt 200) -or (300 -ge $s)
}
$url = "https://docs.google.com/forms/d/e/$formId/formResponse"
$now = Get-Date
$info = Get-ComputerInfo -Property @( "OsName", "OsVersion", "CsName")
$params = @{
"usp"="pp_url"
"entry.18764741"=$now.toString("yyyy-MM-dd+HH:mm:ss")
"entry.687203154"=$info.CsName
"entry.1024557962"=$info.OsName
"entry.257024779"=$info.OsVersion
"submit"="Submit"
}
$res = Invoke-WebRequest $url -Method 'POST' -Body $params
if (isError($res)) {
exit 1
}
exit 0
タスクスケジューラ
初めは「Postして10分間Sleepして、またPostする」的なデーモンをPowerShellで実装しようしたのですが、考えてみたらWindowsには定期実行の仕組みが既にありましたね。
そう、古き良きタスクスケジューラです。
「タスクの作成」でタスクを作ります。
「全般」で「ユーザーがログオンしているかどうかに関わらず実行する」にチェックを入れます。これにより、実行時にコマンドプロンプトが全く表示されなります。
「トリガー」で新規作成します
- タスクの開始 = ログオン時
- 繰り返し間隔 = 10分間
「操作」で新規作成します
- 操作 = プログラムの開始
- プログラム/スクリプト = "C:\Program Files\PowerShell\7\pwsh.exe"
- 引数の追加 = -c "C:\Path\To\ComputerLog.ps1"
ここでpwsh.exe
にもWindowを非表示にするオプション(-WindowStyle Hidden
)があるのですが、「ユーザーがログオンしているかどうかに関わらず実行する」を指定済なので不要です。逆に-WindowStyle Hidden
を指定しただけだと、コマンド実行時にコマンドプロンプトが一瞬だけ表示されてしまいます。
実行
PCにログインし直します。ログが送信されます。
なお、タスクスケジューラ上からスクリプトを実行することもできます(画像に残っている半端な時刻はそれ)。
なお、回答ごとにタイムスタンプが記録されるので、実はTimeフィールドは不要でした。
また、時刻は分までしか受け付けないので秒は不要でした。
感想
久しぶりにWindowsでプログラミングしてPowerShellが高機能なことに驚きました。タスクスケジューラも世間では不評のようですが、UIデザインが時代がかっているのはともかく、機能的には必要十分で使いやすいと思ったのですがいかがでしょう?