
本文介绍如何利用 windows 任务计划程序,在系统完成关机并重新启动后,自动弹出自定义提示消息。核心方案是创建一个开机触发的计划任务,执行 python 脚本调用 gui 提示框,并重点解决因 python 解释器路径缺失导致的任务执行失败问题。
本文介绍如何利用 windows 任务计划程序,在系统完成关机并重新启动后,自动弹出自定义提示消息。核心方案是创建一个开机触发的计划任务,执行 python 脚本调用 gui 提示框,并重点解决因 python 解释器路径缺失导致的任务执行失败问题。
在 Windows 中实现“关机后重启时弹出通知”,关键在于利用系统级的 onstart 触发器——该触发器会在 Windows 登录会话启动时(即用户成功登录后)运行任务,完美适配 shutdown /s /hybrid 后的快速启动恢复场景。
你提供的代码逻辑基本正确:生成 .pyw 脚本、写入 pymsgbox.alert()、再通过 schtasks /create /sc onstart 注册任务。但失败的根本原因正如答案所指出:schtasks 在系统上下文(SYSTEM 或无交互会话)中执行时,无法识别 py 命令别名——它默认只搜索 C:WindowsSystem32py.exe,而实际 Python 通常安装在 C:Users 或 C:PythonXX 等路径。
✅ 正确做法是:显式指定 Python 解释器的绝对路径。可通过 sys.executable 获取当前运行脚本所用的 Python 可执行文件路径,确保任务调用的是同一环境:
import os
import sys
import tempfile
import subprocess
def leave_message_on_startup(message: str, task_name: str = "StartupMessageAlert"):
# 生成临时 .pyw 脚本(.pyw 避免黑窗口)
script_content = f'''import pymsgbox
pymsgbox.alert("{message.replace('"', '\"')}", "系统启动提醒")
'''
# 使用系统临时目录,避免权限问题
temp_dir = tempfile.gettempdir()
script_path = os.path.join(temp_dir, f"{task_name}.pyw")
with open(script_path, "w", encoding="utf-8") as f:
f.write(script_content)
# ✅ 关键修复:使用 sys.executable 替代 'py'
python_exe = sys.executable.replace("\", "\\")
task_command = (
f'schtasks /create /tn "{task_name}" '
f'/tr "{python_exe} {script_path}" '
f'/sc onstart /ru "NT AUTHORITY\SYSTEM" /f'
)
# 执行命令并捕获结果
result = subprocess.run(task_command, shell=True, capture_output=True, text=True)
if result.returncode == 0:
print(f"✅ 计划任务 '{task_name}' 创建成功,将在下次启动时触发。")
else:
print("❌ 任务创建失败:")
print("命令:", task_command)
print("错误输出:", result.stderr.strip() or result.stdout.strip())
# 使用示例
if __name__ == "__main__":
leave_message_on_startup("欢迎回来!系统已成功重启。")
⚠️ 注意事项:
-
权限要求:
/ru "NT AUTHORITY\SYSTEM"表示以系统账户运行(推荐),但需以管理员身份运行此 Python 脚本(右键 → “以管理员身份运行”),否则schtasks将拒绝创建高权限任务。 -
GUI 可见性:
onstart任务在用户登录前就可能启动,但pymsgbox窗口仅在用户会话处于活动状态时可见。若需更可靠唤醒,可改用/sc onlogon(用户登录时触发),对应参数为/ru "%USERDOMAIN%\%USERNAME%"。 -
依赖安装:确保目标机器已安装
pymsgbox:pip install pymsgbox -
清理任务(调试用):
schtasks /delete /tn "StartupMessageAlert" /f
? 总结:schtasks /sc onstart 是实现关机重启通知的最轻量、原生方案;成败关键不在脚本逻辑,而在解释器路径的绝对化与执行权限的匹配。用 sys.executable 替代模糊的 py 命令,辅以管理员权限和合理任务配置,即可稳定生效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











