Windows 计划任务跑 Python 脚本没反应:0x1 和 0x41301 的排查

举报
phantomxjc 发表于 2026/09/24 08:51:43 2026/09/24
【摘要】 脚本双击跑得好好的,丢进任务计划程序就没动静了。这种事我踩过不止一次,最折腾的一回是一个每天早八点跑的数据同步脚本,手动点开一切正常,挂到计划任务上连着三天没产出,日志里干干净净。最后翻到「上次运行结

脚本双击跑得好好的,丢进任务计划程序就没动静了。这种事我踩过不止一次,最折腾的一回是一个每天早八点跑的数据同步脚本,手动点开一切正常,挂到计划任务上连着三天没产出,日志里干干净净。最后翻到「上次运行结果」那一列写着 0x1,才反应过来——它跑了,只是进去就挂了。

这篇把 Windows 任务计划程序(Task Scheduler)跑 Python 脚本最常见的几个坑记一下,包括怎么看懂那串十六进制的返回码。

先找到「上次运行结果」

任务计划程序界面里默认有一列叫「上次运行结果」,很多人的库里这列没显示,在右侧「查看」里勾上就行。

常见的几个值:

  • 0x0:成功。如果显示这个但你觉得没跑,那是脚本本身逻辑没干活,不是计划任务的问题。
  • 0x1:程序执行了,但内部报错退出。Python 脚本抛异常基本就是这个。
  • 0x41301:任务当前正在运行。这个很容易误判成失败——你以为它没跑,其实上一轮还没结束,新的这次压根没启动。
  • 0x41306:任务被手动终止。
  • 0x8007010B:目录名无效,通常是「起始位置」那一栏填错了,或者填了个不存在的路径。

想看更全的,命令行更直接:

schtasks /query /tn "我的任务名" /fo LIST /v

输出里 上次运行结果、上次运行时间、下次运行时间、作为用户运行 几个字段都在,比在 GUI 里一页页点快。

坑一:「起始位置(可选)」不填,相对路径全废

这是第一大坑,而且它带个「可选」字样,非常具有迷惑性。

在「操作」标签页编辑启动程序时,有三栏:程序或脚本、添加参数、起始位置(可选)。大多数人在前两栏填完就点了确定。

后果是:计划任务启动时的工作目录默认是 C:\Windows\System32。你脚本里写的

with open("data/state.json") as f:
    ...

手动跑的时候工作目录是脚本所在目录,一切正常;计划任务跑的时候就变成了去找 C:\Windows\System32\data\state.json,文件当然不存在,抛 FileNotFoundError,返回 0x1。

两种解法:

  1. 起始位置那一栏老老实实填上脚本所在目录,比如 D:\scripts\(末尾的反斜杠不要带引号,除非路径里有空格)。
  2. 脚本里别用相对路径,用 Path(__file__).parent 把路径钉死:
from pathlib import Path

BASE = Path(__file__).resolve().parent
STATE = BASE / "data" / "state.json"

我个人的习惯是两个都做。第二个尤其推荐,因为脚本换个地方跑也不会崩。

坑二:「只在用户登录时运行」和它的密码陷阱

「常规」标签页里有个安全选项,两个单选:

  • 只在用户登录时运行
  • 不管用户是否登录都要运行

选第一个的话,机器重启后在你输入密码登录之前,任务不会跑;远程桌面断开、锁屏的某些情况下也可能不触发。对「每天早八点跑一次」这种需求来说,这基本等于不定时炸弹。

选第二个,点确定时会让你输一次密码,之后它就以那个凭据在后台跑。这里埋着第二个雷:你改了 Windows 登录密码之后,这个任务就废了。它会静悄悄地失败,返回 0x1 或者干脆不启动,直到你重新进去输一次密码。

如果是单位机器,域账号密码三个月一改,那基本上每三个月要巡检一次。命令行的改法比 GUI 快:

schtasks /change /tn "我的任务名" /rp 新密码

另外一个细节:勾选「不管用户是否登录都要运行」时,任务默认不以最高权限运行。如果脚本碰了系统目录或者需要写注册表,记得把「使用最高权限运行」也勾上,否则会看到 0x1 但日志里什么都没有。

坑三:PATH 里找不到 python

「程序或脚本」那一栏填 python,是第三大坑。

原因有两个:一是非登录会话里 PATH 可能和你自己开终端时不一样;二是 Windows 有个恶心的东西叫「应用执行别名」,你在设置里关掉之前,敲 python 会跳微软商店,而不是真的执行解释器。

所以永远写绝对路径:

C:\Users\Administrator\.workbuddy\binaries\python\envs\default\Scripts\python.exe

如果是虚拟环境,注意是 Scripts\python.exe(Windows),不是 Linux 那套 bin/python。用错了会得到一个 0x1,而且没有任何提示。

不确定自己的解释器在哪,就在能跑通的终端里问一句:

where python
python -c "import sys; print(sys.executable)"

第二条打印出来的才是真正该填进计划任务的路径。

坑四:SYSTEM 账户访问不了网络盘

如果任务是用 SYSTEM 或者「不管用户是否登录」的方式跑,还有一个隐蔽的坑:映射的网络驱动器在那个会话里根本不存在。

你在资源管理器里挂的 Z: 盘,是挂在当前用户会话下的。SYSTEM 会话里没有这个盘符,脚本里写 Z:\data\xxx.json 就是找不到,报 0x1 或者 0x8007010B。

解法是用 UNC 路径:


NAS = Path("Z:/data")

# 可以
NAS = Path(r"\\192.168.1.10\share\data")

要用 UNC 又需要认证的话,脚本开头先 net use 一下:

net use \\192.168.1.10\share /user:用户名 密码 /persistent:no

我在自己的备份脚本里就吃过这个亏,本地测试全过,一挂计划任务就空转,排查了半天才发现是盘符的事。

把错误抓出来:重定向到日志

GUI 里跑的任务是没有控制台的,print() 和 traceback 全都丢进黑洞。所以第一步应该先把输出接住。

有两种做法。一种是在「程序或脚本」里填 cmd.exe,参数填:

/c ""D:\venv\Scripts\python.exe" "D:\scripts\sync.py" >> "D:\scripts\run.log" 2>&1"

注意引号的嵌套,/c 后面整串用一对双引号包起来,里面的路径各自再加引号。写错了会得到 0x1 且日志是空的。

另一种是在 Python 里自己接:

import sys, traceback
from pathlib import Path

log = Path(__file__).with_suffix(".log")

try:
    main()
except Exception:
    log.write_text(traceback.format_exc(), encoding="utf-8")
    raise

我更喜欢第二种,因为它能拿到完整的 traceback,而且不依赖 cmd 的引号写法对不对。

还有几个不那么常见但很坑的

电源选项:「条件」标签页里默认勾着「只有在计算机使用交流电源时才启动此任务」。笔记本拔了电源它就装死。服务器无所谓,办公机一定要取消勾选。

超时停止:「设置」标签页里有「如果任务运行时间超过以下时间则停止任务」,默认三天,一般不用管。但如果你手贱改成了 1 小时,而脚本要跑两个小时,你会看到一个 0x41306。

任务历史记录默认关闭:右侧「操作」里有个「启用所有任务历史记录」,点了之后才能在「历史记录」标签页看到每次启动、启动失败、操作完成的详细事件。排查的时候这个一定要开,否则你只有孤零零一个 0x1。

触发器里的随机延迟:脚本自己带随机延迟(比如为了模拟真人操作)时,任务计划程序这边就别再勾「延迟任务时间」了,两边叠加会让实际执行时间飘得离谱。

现在我的固定写法

一个能长期稳定跑的计划任务,我基本按这个模板配:

  • 常规:不管用户是否登录都要运行 + 使用最高权限运行
  • 触发器:按需求设,不勾随机延迟
  • 操作:程序填解释器绝对路径,参数填脚本绝对路径,起始位置填脚本所在目录
  • 条件:取消「交流电源」那一项
  • 设置:允许按需运行,其他默认

配完先不关窗口,直接在右侧点一次「运行」,然后看「上次运行结果」是不是 0x0。这一步能省掉第二天早上的大部分意外。

说到底,任务计划程序本身很少出问题,出问题的大多是「环境不一样了」——工作目录不一样、PATH 不一样、用户会话不一样。把这三样钉死,剩下的基本就踏实了。

作者:phantomxjc

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。