---
url: /article/ztp8yr6i/index.md
---
## 前言

得益于之前折腾过[Lucky内网穿透](/article/r9qcnh6l/)，我能够远程到内网主机上实现远程开发。而又因为之前折腾过[WOL网络唤醒](/article/u0ns75tk/)，再加上买了一个边缘盒子`OES`，[家庭服务](/article/etzl6hp9/)可以24小时运行，我能够远程控制主机(开机/关机/重启/休眠)，实现按需启动。\
当我在外时，只用一个低配轻薄笔记本也能实现重任务的开发工作，因为是中心工作站，可以保持统一的开发环境，工作本无需安装开发环境，能联网即可。但是随之而来有个小问题，经常会在断开远程连接后忘记了关闭远程主机，导致可能白白运行十多个小时。因此，就想实现主机在线通知。

## 原理

在 iOS 上最简单的消息通知方就用 `Bark`，由于通知消息不涉及敏感内容，因此使用公共服务器即可。\
触发方式也简单，利用 Windows 的`任务计划程序`，搭配`Powershell`脚本即可。

## 实操

### iOS

在 AppStore 搜索`Bark`应用并安装，打开后首页会看到类似`https://api.day.app/xxxxxxxxxxxxx`的地址，记录下来。

### Windows

按下`Win`+`S`打开搜索输入`任务计划程序`，会打开面板，点击面板右侧`创建基本任务`。

1. 创建基本任务：输入名称和描述。
2. 触发器：选择`计算机启动时`。
3. 操作：选择`启动程序`，接着按下`Win`+`R`输入`cmd`执行`where powershell`查找`PowerShell`程序的位置，会看到如`C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`，将这个地址填入`程序或脚本`都输入框中，`添加参数`输入框中填`-WindowStyle Hidden -Command "$u=(Get-Date)-(Get-CimInstance Win32_OperatingSystem).LastBootUpTime; $h=[math]::Floor($u.TotalHours); $m=$u.Minutes; $msg='已运行：'+$h+'小时'+$m+'分钟'; Invoke-RestMethod -Uri ('https://api.day.app/xxxxxxxxxxxxx/B560M主机在线通知/'+$msg)"`。
4. 完成：点击`完成`即可。

接着找到刚刚创建好的任务，右键点击`属性`：

1. 常规：确保勾选`不关用户是否登录都要运行`、`不存储密码`。
2. 触发器-编辑：确保**开始任务**是`启动时`。**高级设置**下**延迟任务时间**可以选择最小时间，注意不是只能用下拉框中的时间，可以手动编辑如`5秒`、**重复任务间隔**一样可以手动编辑如`4小时`、**持续时间**选择`无期限`。确保**已启用**是勾选状态。
3. 条件：确保只勾选了**只有在以下网络连接时才启动**，并选择`任何连接`。
4. 设置：推荐勾选这些**允许按需运行任务**、**如果过了计划开始时间，立即启动任务**、**如果任务执行失败，按以下频率重新启动**，确保能够手动执行、一定执行、失败重试。

## 效果

当 Windows 启动后时，会在延迟 5 秒后执行一次消息通知，并且在每隔 4 小时执行一次。

## 提示

> `触发器`和`条件`的区别

一开始可能会有点疑惑，为什么有了`触发器`还需要`条件`？\
其实`触发器`规定了计划任务在什么时候触发，但触发并不代表一定会执行。到底会不会执行需要看`条件`。这里我们设置了一个条件是，当连接到任务网络的时候才可以触发。因为这个脚本中需要发送 HTTP 请求，所以必须要网络。如果再触发时发现断网了，那么这个脚本就不会被执行，因为执行了也肯定会失败。\
如果是其他无需网络的任务，则可以把条件去掉，只要触发了就会执行。
