他人が管理してるあるファイルで、更新されたら連絡もらってあれこれ対応する、という仕事がある。頻度は高くない。が、更新されたらやらなければならない。
連絡もらってやりとりるすのがめんどくさい。更新チェックを自動化しよう。
必要な要素
- 更新されたかどうかの判断…タイムスタンプ。
- 通知方法…無難にメール。
- 定期チェックの方法…Windowsのタスクスケジューラでいいか。
ファイル情報取得
# 更新をチェックしたいファイルの情報取得
$Target_Property = Get-ItemProperty ".\Target.txt"
$Target_Property.LastWriteTime.ToString()
でタイムスタンプをテキストで取得できる。
前回の更新日を取得
これは別ファイルに持っておく。
Target_Update_Record.txt
2022/07/10 00:00:00
2022/07/11 11:11:11
2022/07/12 22:22:22
2022/07/14 10:00:00
# 前回の更新日を読み込む
$Target_PreviousUpdateDate = Get-Content ".\Target_Update_Record.txt" -Tail 1
Get-Content -Tail 1
は最終行が空行だった場合無視してその1行前を読んでくれるのでありがたい。
タイムスタンプと前回の更新日を比較
if( $Target_Property.LastWriteTime.ToString() -eq $Target_PreviousUpdateDate ){
# 更新されてない
}else{
# 更新されてる
}
完成
# あるファイルの更新をチェックして通知する
# スクリプトフォルダへ移動
$ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $ScriptPath
# 更新をチェックしたいファイルの情報取得
$Target_Property = Get-ItemProperty ".\Target.txt"
# 前回の更新日を読み込む
$Target_PreviousUpdateDate = Get-Content ".\Target_Update_Record.txt" -Tail 1
# 更新されているかチェック
if( $Target_Property.LastWriteTime.ToString() -eq $Target_PreviousUpdateDate ){
# 更新されてない
# 更新されてないことをログ記録したり通知したり 省略
}else{
# 更新されてる
# メール通知する
$MailParam = @{
from = "checker@example.com"
to = "me@example.com"
smtp = "mailserver.example.com"
subject = "ターゲットが更新された"
body = "T/O"
Encoding = ([System.Text.Encoding]::UTF8)
}
Send-MailMessage @MailParam
# 更新された日付を書き込む
$Target_Property.LastWriteTime.ToString() | Out-File -LiteralPath ".\Target_Update_Record.txt" -Encoding default -Append
# 対応するあれこれ、が自動化できるならそれも記述
}
最も良い解決は…
管理してるそいつにすべての対応をしてもらうよう政治的な解決を図る。
できないので、現状を追認する…。