在 WSL 里面运行命令时,有时候要等很久,就会去做一些别的事情(其实就是去摸鱼了)。但是做别的搞久了就会忘记,或者等想起来的时候命令已经执行完很久了,所以我想着能不能在 WSL 里面运行命令结束后,给 Windows 发送通知。

Github 有一个叫做wsl-notify的项目,但是已经多年没有更新了,最后找到了一个 Powershell 的模块BurntToast,而 WSL 中可以把 Windows 下可执行文件的路径写入到 shell 配置中,所以可以在终端调用 Powershell 来发送通知。

  1. 在 Powershell 中安装 BurntToast 模块:
1
Install-Module -Name BurntToast
  1. 在 WSL 中进行配置:
1
2
3
4
5
6
alias powershell="/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe"
notify() {
local title="${1:-WSL 通知}"
local msg="${2:-命令已运行完成}"
powershell -Command "New-BurntToastNotification -Text '${title}', '${msg}'"
}
  1. 使用方法:
    在 WSL 中运行命令后,调用notify函数即可发送通知。例如:
1
sudo apt update && notify "更新完成" "apt update 已经完成"

当然还有一些奇技淫巧,例如一行命令产生一个必须要点击的通知:

1
2
alias powershell="/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe"
powershell -Command "& {Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('$1', 'WSL 通知')}"