Rubyの処理が終わったらデスクトップ通知したくなりました。
結論
- 通知powershellスクリプトを書いておく
- powershellの実行ポリシーを設定しておく
- rubyのsystemメソッドでpowershellを実行する
詳細
Rubyのgem等、調べましたがうまくいかず足踏みする時間ももったいないのでWindowsのcmdかpowershellでデスクトップ通知するアイディアが浮かびました。
結果、powershellです。
1時間かかりましたが、結果うまくいきました。
通知は簡易的なもので、rubyの処理の最後にデスクトップ通知するだけのものです。のちのち必要があればカスタマイズしようと思います。
rubyでpowershellスクリプトを実行する方法のは、こちらです。
system("powershel .\\test.ps1")
しかし、最初はエラーが起きてました。その理由はpowershellはデフォルトでコマンドラインから実行されないようになっているようです。
Google検索「コマンドラインから powershellを実行 設定」とか調べると、参考にさせていただきました。
Powershellを楽に実行してもらうには – Qiita
https://qiita.com/tomoko523/items/df8e384d32a377381ef9
めちゃめちゃわかりやすかったです。
管理権限でpowershellを開くには、ファイル名を指定して実行にpowershellと打ち込んで、ctrlとshiftを推しながらENTERを押すのが個人的に染み付いてます。
そして、
Set-ExecutionPolicy RemoteSigned
からの「Yes」っていうことです。
これで、
system("powershel .\\test.ps1")
が動くようになります。
test.ps1の中身はこんな感じ。
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
$app = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe'
$template = @"
<toast launch="app-defined-string">
<visual>
<binding template="ToastGeneric">
<text hint-maxLines="1">通知</text>
<text>作業が終了しました</text>
</binding>
</visual>
</toast>
"@
$output = New-Object Windows.Data.Xml.Dom.XmlDocument
$output.LoadXml($template)
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($app).show($output)
#pause
powershellは文字コードANSIで作成すると日本語でも文字化けしませんでした。
参考
PowerShellでトースト通知を送る – 3テラバイト
https://santerabyte.com/powershell-toast-notification/
Windows 10 でトースト通知を飛ばす | なつねこメモ
https://www.natsuneko.blog/entry/2015/11/16/toast-notification
Toast content – Windows apps | Microsoft Docs
https://docs.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=xml