Rubyからpowershellを使ってWindowsにデスクトップ通知する方法

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

スポンサーリンク
投稿記事
スポンサーリンク
OKE2GOU