1. 项目概述:为iFlow CLI添加Windows任务完成通知
作为一名长期使用iFlow CLI进行任务管理的开发者,我经常遇到一个问题:当后台任务执行完成时,缺乏直观的提醒机制。在Mac环境下有现成的解决方案,但Windows平台一直缺少稳定可靠的通知方案。经过多次尝试,我发现通过BurntToast模块配合Python脚本,可以完美实现任务完成时的系统级弹窗通知。
这个方案的核心价值在于:
- 即时反馈:长时间运行的任务完成后能立即获得视觉提醒
- 非侵入式:通过Windows原生通知中心推送,不影响当前工作
- 高度可定制:可以自由设置通知图标、文本、声音等元素
- 低资源占用:基于系统原生功能实现,不需要额外运行后台服务
2. 环境准备与工具选型
2.1 BurntToast模块安装与验证
BurntToast是一个PowerShell模块,专门用于创建和显示Windows 10/11的Toast通知。选择它的原因包括:
- 官方维护:由PowerShell团队核心成员维护,更新及时
- 功能全面:支持按钮交互、进度条、自适应模板等高级特性
- 安装简便:一行命令即可完成安装
安装步骤:
powershell复制# 以管理员身份运行PowerShell
Install-Module -Name BurntToast -Force -AllowClobber
安装后验证模块是否可用:
powershell复制Get-Module -Name BurntToast -ListAvailable
注意:如果遇到执行策略限制,需要先运行:
powershell复制Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
2.2 Python环境配置
推荐使用Python 3.7+版本,确保已安装以下库:
bash复制pip install psutil
验证Python能否正常调用PowerShell:
python复制import subprocess
subprocess.run(["powershell", "-Command", "Get-Host"], check=True)
3. 通知脚本开发详解
3.1 基础通知脚本实现
以下是完整的Python脚本实现(保存为stop.py):
python复制#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess
import os
from pathlib import Path
def get_script_dir():
"""获取脚本所在目录"""
return Path(__file__).parent.absolute()
def send_toast_notification():
"""发送Toast通知"""
script_dir = get_script_dir()
icon_path = script_dir / "iflow.png"
ps_command = f"""
New-BurntToastNotification -AppLogo '{icon_path}'
-Text '任务已完成', 'iFlow CLI任务执行完毕'
-Attribution '系统通知'
-Sound 'Default'
"""
try:
result = subprocess.run(
["powershell", "-Command", ps_command],
capture_output=True,
text=True,
timeout=10
)
if result.returncode != 0:
print(f"通知发送失败: {result.stderr}")
except Exception as e:
print(f"执行错误: {str(e)}")
if __name__ == "__main__":
send_toast_notification()
3.2 关键参数解析
-
-AppLogo:通知图标路径,建议使用:
- 尺寸:64x64像素
- 格式:PNG透明背景
- 存放位置:与脚本同目录
-
-Text:通知内容,支持多行:
powershell复制-Text '第一行标题', '第二行内容', '第三行补充信息' -
-Sound:支持以下预设声音:
powershell复制-Sound 'Default' | 'IM' | 'Mail' | 'Reminder' | 'SMS'
3.3 高级定制技巧
添加交互按钮
powershell复制$button = New-BTButton -Content '查看详情' -Arguments 'action=view'
New-BurntToastNotification -Text '任务完成' -Button $button
设置过期时间
powershell复制-ExpirationTime ([DateTime]::Now.AddMinutes(5))
使用自定义声音
powershell复制$sound = New-BTSound -Source 'C:\custom.wav'
New-BurntToastNotification -Text '提醒' -Sound $sound
4. iFlow CLI集成配置
4.1 hook配置详解
在iFlow的settings.json中添加以下配置(路径需替换为实际值):
json复制{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "python C:/path/to/your/stop.py"
}
]
}
],
"Error": [
{
"hooks": [
{
"type": "command",
"command": "python C:/path/to/your/error.py"
}
]
}
]
}
}
4.2 路径处理最佳实践
- 绝对路径:建议使用完整路径而非相对路径
- 路径转换:
python复制import os script_path = os.path.abspath(__file__) - 跨平台兼容:
python复制path = "C:/path/to/file" # 正斜杠兼容所有平台
5. 常见问题排查指南
5.1 通知不显示的排查步骤
-
检查Windows通知设置:
- 系统设置 > 通知 > 确保iFlow相关通知未被禁用
-
验证PowerShell命令是否有效:
powershell复制New-BurntToastNotification -Text '测试通知' -
检查Python脚本执行权限:
powershell复制Get-ExecutionPolicy -List
5.2 性能优化建议
-
减少启动延迟:
python复制# 预加载PowerShell进程 subprocess.Popen(["powershell", "-NoProfile"]) -
异常处理增强:
python复制try: # 通知代码 except subprocess.TimeoutExpired: print("执行超时,可能是防病毒软件拦截") except FileNotFoundError: print("PowerShell路径错误")
6. 扩展应用场景
6.1 不同类型任务的通知区分
python复制import sys
task_type = sys.argv[1] if len(sys.argv) > 1 else "default"
messages = {
"build": ("构建完成", "项目编译成功"),
"test": ("测试通过", "所有用例执行完毕"),
"deploy": ("部署成功", "新版本已上线")
}
title, content = messages.get(task_type, ("任务完成", "操作已执行"))
6.2 与任务管理系统集成
python复制def get_task_info(task_id):
"""从iFlow API获取任务详情"""
import requests
response = requests.get(f"http://localhost:8080/tasks/{task_id}")
return response.json()
task_data = get_task_info("current")
ps_command = f"""
New-BurntToastNotification -Text '{task_data["name"]}',
'耗时: {task_data["duration"]}'
"""
7. 安全与维护建议
-
脚本安全:
- 限制Python脚本执行权限
- 不要使用管理员权限运行通知脚本
-
定期检查:
powershell复制Update-Module -Name BurntToast -
日志记录:
python复制import logging logging.basicConfig(filename='notifications.log', level=logging.INFO)
这套通知系统在我的日常工作流中已经稳定运行了6个月,平均每天触发20+次通知,从未出现漏报或误报情况。对于需要长时间运行的任务,这种即时反馈机制显著提高了工作效率。