1
1

More than 1 year has passed since last update.

PowerShellとGoogleFormとタスクスケジューラでパソコンの起動時間を記録する仕掛けを作ってみた

Posted at

ふと、自分は一日にどれくらいコンピュータの勉強をしているのだろうか?と疑問に思い、勉強用に使ってるWindows PCの起動時間を記録することにしました。

そういうフリーウェアは既にあるような気がしましたが、簡単そうなので自作してみました。

なおPowerShellは今回始めて触ります。

Google Form を作る

作ったフォーム.png

フォームには以下の項目を設けました。

  • Time: 日付と時刻
  • CsName: PCの名前
  • OsName: OS名
  • OsVersion: OSのバージョン

Timeは「日付」タイプを選択した後、「時刻を含める」で日付と時刻を記録できます。

さて、このフォームにPowerShellから回答をPostすることになるのですが、フォームの項目のIDは"Time" のようなリーダブルなものではなく、単純な"18764741" みたいなランダムな数値は割り振られます。

このIDを調べるには、そして「送信」ボタン横のメニューの事前入力したURLを取得からサンプル回答を作ります。

事前入力したURLを取得.png

取得した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にログインし直します。ログが送信されます。

なお、タスクスケジューラ上からスクリプトを実行することもできます(画像に残っている半端な時刻はそれ)。

image.png

なお、回答ごとにタイムスタンプが記録されるので、実はTimeフィールドは不要でした。
また、時刻は分までしか受け付けないので秒は不要でした。

感想

久しぶりにWindowsでプログラミングしてPowerShellが高機能なことに驚きました。タスクスケジューラも世間では不評のようですが、UIデザインが時代がかっているのはともかく、機能的には必要十分で使いやすいと思ったのですがいかがでしょう?

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1