Windows 上”开机自启”根据程序性质要选不同方式。一股脑塞启动文件夹经常出问题——GUI 程序有个 UAC 弹窗、脚本要读用户目录、长驻服务要跑在 SYSTEM 下——分类拆开来看。
方式一:启动文件夹(普通程序)
Win + R 打开:
shell:startup
这是当前用户的启动目录。把 .exe 或 .lnk 快捷方式扔进去就行。全用户共用:
shell:common startup
局限:
- 用户登录后才启动
- 弹 UAC 会需要手动点
- 关了窗口就没了
适合:桌面小工具、常用软件(VSCode、Chrome 等已经自带这个)。
方式二:NSSM 把脚本包成服务(推荐)
长驻的 Python、Node、FastAPI、Uvicorn 等脚本,最省心是用 NSSM。它能把任何 exe/bat/脚本包装成 Windows 服务。
管理员 CMD:
nssm install MyService
弹出 GUI,填三项:
Application → Path: C:\Python311\python.exe
Application → Arguments: -m uvicorn main:app --host 0.0.0.0 --port 8000
Application → Startup directory: D:\project
设自动启动:
sc config MyService start= auto
(start= 和 auto 之间必须有空格。)
启动 / 停止 / 删除:
net start MyService
net stop MyService
nssm remove MyService confirm
NSSM 的好处:
- 崩溃自动重启(Details 里配 Exit Action)
- stdout / stderr 可以重定向到日志文件
- 支持环境变量、依赖、恢复策略
- 卸载干净
方式三:原生 sc create(真 EXE 程序)
已经写成了 Windows Service 兼容的 EXE:
sc create MyService binPath= "D:\app\server.exe" start= auto
sc start MyService
sc delete MyService
局限:
- 只能接已经实现了 ServiceMain 的 EXE
- 普通脚本用这个会秒退,要靠 NSSM
方式四:任务计划程序(脚本 / GUI / 用户上下文)
需要在用户登录后启动、或者要 GUI、或者 SYSTEM 下跑不了的:
schtasks /create /tn "MyTask" ^
/tr "C:\Users\me\bin\worker.py" ^
/sc onlogon
场景:
- 只登录时启动:
/sc onlogon - 每次开机(不管登录):
/sc onstart(需要管理员) - 每天 03:00:
/sc daily /st 03:00
管理:
schtasks /query /tn "MyTask"
schtasks /run /tn "MyTask"
schtasks /delete /tn "MyTask" /f
选哪一种
| 场景 | 推荐 |
|---|---|
| 只想开机跑一次的桌面程序 | 启动文件夹 |
| Python/Node 长驻脚本、API、爬虫 | NSSM(默认选它) |
| 已经是 Windows Service 兼容 EXE | sc create |
| GUI 程序、要用户桌面 session | 任务计划 onlogon |
| 系统级、无用户登录也要跑 | 任务计划 onstart 或 NSSM |
一句话总结
长驻脚本 = NSSM,开机自动、崩溃自愈、日志齐全。其它类型再按上面表格分。
