ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Windows定时关机完全指南:从shutdown命令到Python脚本

Windows定时关机完全指南:从shutdown命令到Python脚本 1. 定时关机的实际场景与核心实现逻辑1.1 这些情况下你是真的需要到点关机我在帮朋友和同事处理电脑问题的时候被问得最多的一句话是有没有办法让电脑到点自己关机 场景往往非常具体晚上挂机下载几十个GB的游戏人不可能守着白天上班前启动了一个视频渲染下班到家早就该跑完了又或者只是单纯不想让电脑亮一整晚既费电又积灰。还有一类需求是家长或者办公室管理员常用的——限制孩子或员工在某个时间之后不能再使用电脑。很多人一听到定时关机就觉得是高手才玩得转的操作其实完全不是。Windows 自带的 shutdown 命令就能做到花十秒钟设置完直接走人如果想要更灵活、更自动化再上 Python 写脚本从三行代码到一个带界面、带倒计时的定时关机工具都不算难。这篇文章就把我实际用过的、给不同电脑验证过的各种方案整理出来涵盖命令行、任务计划程序、批处理脚本、PowerShell/WMI 以及多种 Python 实现方式方便你按自己的需求去选。1.2 所有方案的底层逻辑其实只有两件事不管表面上的操作多花哨定时关机这件事拆开看永远只有两步第一步是定时第二步是关机。定时有三种常见形态一种是相对延时比如3600 秒之后关机由 shutdown 命令的 /t 参数完成另一种是绝对时间点比如今晚 23:00 关机由任务计划程序的触发器完成还有一种是程序内部自行控制延时比如 Python 脚本里用 time.sleep() 睡够时间再去触发关机。三种定时方式适用场景不同但目标一致。关机这一步就更统一了。Windows 最终都会走到系统关机流程shutdown.exe 是面向用户最常用的门户PowerShell 的 Stop-Computer、WMI 的 Win32Shutdown、C 语言层的 ExitWindowsEx 本质上都是同一个系统关机动作的封装。理解了这层关系你就不会被多种方法吓到——它们不是彼此割裂的黑魔法而是一套东西在不同层面的表现。后面我写的所有代码和操作其实都是定时方式和关机方式的自由组合。2. Windows 自带方案先学会跑再谈代码2.1 shutdown 命令一条命令解决九成需求最简单、最不需要安装任何东西的方式就是用 shutdown 命令。按下 Win R 组合键在弹出的运行框里直接输入下面这行回车电脑就会在 1 小时后关机shutdown /s /t 3600这条命令里/s 表示执行关机操作/t 后面的数字是延时秒数3600 秒正好是 1 小时。如果你想快一点验证效果可以把数字改小比如 /t 60 就是 60 秒后关机。需要注意这里的单位是秒不是分钟更不是小时很多人在这一步翻车设置 120 以为是一小时实际只是两分钟。除了关机shutdown 命令还有几个常用参数值得记一下参数作用示例/s关机shutdown /s /t 3600/r重启shutdown /r /t 600/f强制关闭正在运行的程序shutdown /s /f /t 300/a取消当前已设置的定时关机shutdown /a/i打开图形化关机设置窗口shutdown /i我平时最常用的组合是 shutdown /s /f /t 3600。加 /f 的好处是关机时不会因为某个程序弹窗是否保存而卡住进度坏处也一样明显——没保存的文档有丢失风险所以用 /f 之前自己心里要有数。如果只是想在睡前让电脑自己关又开着不少工作文档我建议不要加 /f宁可让它卡住也别强杀。直接在运行框里输入命令是最快的路子但它有两个小限制一是运行框里的命令默认不会显示任何反馈你回车后感觉像没反应一样其实系统托盘区稍后会弹出通知二是如果你在运行框里输入带空格的复杂命令偶尔会因为路径或引号问题出错。所以更稳妥的做法是先按 Win R 输入 cmd 打开命令行窗口然后在里面执行 shutdown 命令这样能看到明确的提示信息。2.2 任务计划程序到点自动触发不需要自己算延时如果你需要的是每天固定时间关机或者某个绝对时间点关机那就不应该用 shutdown 的延时参数而要用任务计划程序。因为 shutdown /t 是相对延时你设好之后还得自己心里算一下当前时间加多少秒任务计划程序则是直接指定今晚 23:00 执行系统到点自动触发。操作步骤并不复杂按 Win 键输入任务计划程序并打开在右侧操作栏点击创建基本任务名称填定时关机描述随便写触发器选择一次然后设置具体的年、月、日和时刻操作选择启动程序在程序或脚本一栏填 shutdown.exe在添加参数一栏填 /s /f /t 60最后点击完成。这样任务到点后会执行 shutdown.exe并附带 60 秒的缓冲时间。有一个细节经常被忽略任务计划程序里程序或脚本栏不要写完整路径带参数比如不要填 C:\Windows\System32\shutdown.exe /s /f /t 60而应该把程序和参数拆开。程序栏只写 shutdown.exe参数栏单独写。另外如果你之前已经创建过同名的定时关机任务新建前最好把旧任务禁用或删除否则可能出现重复触发、两个任务互相干扰的情况。任务计划程序还有一个特点它触发的前提是电脑处于开机状态。如果到点了电脑正在睡眠或休眠任务不会自动唤醒电脑去执行关机这一点和手机闹钟不同很多人会误以为设置了就高枕无忧。需要固定时间关机的场景我建议同时把电源计划改成从不睡眠或者确保你人不在电脑前时它也是清醒的。2.3 两种自带方案什么时候选哪个命令行和计划任务并不是互斥的但选择依据很明确临时一次性的需求直接用 shutdown /t 延时固定每天的重复需求用任务计划程序。如果你只是今天下班前想让它 2 小时后关那没必要去开任务计划程序杀鸡用牛刀如果你想每天凌晨自动关机那就别指望手动敲命令因为重启之后延时就消失了计划任务却能长期存在并按计划反复触发。还有一个实操心得如果你在办公室给公用电脑设置定时关机我强烈建议用任务计划程序而不是命令行。因为命令行设置的定时关机在系统重启后失效如果同事中途重启了电脑你的设置就白费了计划任务则是持久化的重启后依然存在。我在给公司几台演示机做每天 22 点自动关机时就是靠计划任务实现三个月没出过岔子。3. 批处理和 WMI从手动走向脚本化3.1 用 bat 把常用定时方案打包成菜单命令行虽然快但每次都要记参数对不熟悉电脑的朋友来说门槛还是偏高。一个很讨巧的折中方案是写一个批处理文件把常用的定时关机配置固化成菜单双击就能用。下面这个 bat 脚本是我给朋友做的包含 1 小时关机、2 小时关机、取消关机三个选项足够覆盖大多数临时场景echo off chcp 65001 nul echo echo 定时关机小菜单 echo echo 1. 1 小时后关机 echo 2. 2 小时后关机 echo 3. 取消定时关机 echo set /p choice请输入数字后回车: if %choice%1 shutdown /s /f /t 3600 if %choice%2 shutdown /s /f /t 7200 if %choice%3 shutdown /a pause把这个内容保存为定时关机.bat然后双击运行它会等待你输入数字再执行对应的 shutdown 命令。set /p 的作用是读取用户输入并存进变量 choice后面用 if 判断用户选了哪一项。保存时要注意编码如果你用 Windows 10/11 自带的记事本默认可能是 UTF-8 编码所以我在脚本第一行加了 chcp 65001 切换到 UTF-8 代码页避免中文乱码如果某些旧系统执行时中文依然乱码把整个文件另存为 ANSI 编码再试一次。这段脚本的本质还是调用 shutdown.exe只不过帮用户省去了记参数的过程。我建议把 bat 文件放在一个固定的目录再右键发送到桌面快捷方式不然哪天文件被清理掉定时关机的入口也就消失了。批处理方案适合给电脑基础一般的家人用但它有个明显短板没有倒计时显示设置了之后用户不知道还剩多少时间。3.2 WMI 和 PowerShell另一种调系统关机的方式如果你经常写 Windows 管理脚本可能还会遇到 WMI 风格的关机调用。PowerShell 里最简单的一条命令是Stop-Computer -Force但这只表示立刻关机和定时没关系。要定时就得先等一段时间于是你会写出下面这种组合Start-Sleep -Seconds 3600; Stop-Computer -Force意思是先睡 3600 秒再执行关机。这种写法在临时脚本里能用但你的 PowerShell 窗口必须一直开着一旦关掉窗口后面的 Stop-Computer 就不会执行远不如 shutdown /t 可靠因为 shutdown /t 的延时是交给系统进程维护的不依赖某个脚本窗口。WMI 方式则是用 Win32_OperatingSystem 类的 Win32Shutdown 方法调用方式如下(Get-WmiObject Win32_OperatingSystem).Win32Shutdown(1)这里的参数 1 表示关机2 表示重启0 表示注销。需要特别提醒Win32Shutdown 的参数不是秒数而是关机动作类型很多人以为传 60 就是 60 秒后关机实际上会直接触发立即关机。WMI 调用通常需要管理员权限否则可能报拒绝访问。我的结论是普通用户定时关机完全没必要绕这一圈WMI 更适合那些本来就在写系统巡检、批量管理脚本的人顺手把关机操作也纳入同一套管理框架。4. Python 版定时关机从三行代码到可视化工具4.1 准备工作先确认 Python 环境到了这篇文章的主角环节。用 Python 做定时关机的最大好处是可以叠加你自己的逻辑比如某个进程跑完再关检测到电脑空闲 20 分钟再关提前 5 分钟弹窗提醒这些用纯命令行做不到。动手之前先确认环境。按 Win R 输入 cmd 打开命令行执行python --version如果能看到 Python 3.x 的版本号说明环境已经就绪。如果提示python 不是内部或外部命令那你需要先去 Python 官网下载安装包安装过程中务必勾选Add Python to PATH这一项否则装完还是找不到命令。我见过太多人在这一步卡住其实就少勾了那个复选框。装完以后重新打开一个 cmd 窗口再次执行 python --version 确认。4.2 最简版os.system 三行搞定Python 里最直接的办法是用 os.system 去执行 shutdown 命令本质上就是让 Python 帮你敲那条 Windows 命令import os # 3600 秒后强制关机 os.system(shutdown /s /f /t 3600)执行后电脑会进入 60 分钟倒计时这个倒计时由系统接管即使你关闭 Python 窗口关机计划依然有效。取消定时也简单import os os.system(shutdown /a)os.system 的好处是简单坏处同样明显它会把命令交给系统的 shell 去解释你传进去的字符串如果包含空格或特殊字符很容易踩引号和转义的坑而且它无法拿到命令行的输出出了问题你不知道系统到底反馈了什么。对于随手写下、自己用的场景它是够用的但如果要写成一个长期维护的脚本我更推荐 subprocess。4.3 工程上更推荐的写法subprocesssubprocess 是 Python 官方推荐的进程调用方式它的参数传递不依赖 shell 字符串拼接而是通过列表直接传参能有效避免空格和转义带来的隐患。下面这段代码封装了一个延时关机函数并检查了 shell 命令的返回状态import subprocess def schedule_shutdown(seconds: int): cmd [shutdown, /s, /f, /t, str(seconds)] result subprocess.run(cmd, capture_outputTrue, textTrue, encodinggbk, errorsignore) if result.returncode 0: print(f已设置 {seconds} 秒后关机) else: print(设置失败, result.stdout.strip() or result.stderr.strip()) if __name__ __main__: schedule_shutdown(3600)这里有几个关键点。第一cmd 是一个列表[shutdown, /s, /f, /t, 3600]每个参数独立成一项不需要手动加空格和引号。第二capture_outputTrue 表示把命令行的输出捕获回来便于判断是否成功。第三encodinggbk 是因为 Windows 中文系统的命令行输出通常使用 GBK 编码如果你不带这个参数在某些环境中捕获到的内容会变成乱码。第四returncode 为 0 表示命令正常执行非 0 则说明出问题了。与之对应的取消函数写成下面这样即可import subprocess subprocess.run([shutdown, /a], capture_outputTrue, textTrue, encodinggbk)subprocess 看起来比 os.system 多几行代码但它的可维护性和健壮性好得多。我自己写自动化脚本时凡是涉及系统命令的调用一律用 subprocess不是因为 os.system 不能用而是因为项目一旦复杂起来字符串拼接的命令行迟早会给你埋雷。路径里一旦出现空格问题立刻暴露。4.4 更底层用 ctypes 直接调用 Windows 关机 API如果你想再往底层走一层可以绕过 shutdown.exe直接用 Python 的 ctypes 调用 Windows 系统 API。比如调用 user32.dll 里的 ExitWindowsEximport ctypes # 参数 1 表示关机0 表示注销2 表示重启 ctypes.windll.user32.ExitWindowsEx(1, 0)这个 API 没有延时参数所以通常要配合 time.sleep 来模拟定时。另一个更符合定时关机语义的 API 是 InitiateSystemShutdownExWimport ctypes message 系统将在 60 秒后关机请及时保存文件。 # 参数本机、提示消息、超时秒数、强制关闭、是否重启、原因代码 ret ctypes.windll.advapi32.InitiateSystemShutdownExW( None, message, 60, True, False, 0 ) if ret 0: print(调用失败请确认是否以管理员身份运行)这个 API 的好处是能弹出一个系统级提示窗口告诉用户系统将在 60 秒后关机体验比 shutdown /t 的托盘通知更醒目。代价是它需要管理员权限而且调用失败时只能拿到一个错误码排查起来没有命令行那么直观。我的建议是除非你在写一个需要自定义关机提示语的系统工具否则没必要上 ctypessubprocess 已经足够解决绝大多数问题。4.5 更友好tkinter 做一个带倒计时的定时关机小工具既然学了 Python很多人的目标其实不是写脚本而是做一个能给别人用的工具。tkinter 是 Python 自带的 GUI 库不需要额外安装做一个带倒计时、带取消按钮的定时关机小工具非常合适。下面是可以直接运行的版本import tkinter as tk from tkinter import messagebox import subprocess class ShutdownTimer: def __init__(self, root): self.root root self.root.title(定时关机小工具) self.root.geometry(360x240) self.remaining 0 self.after_id None tk.Label(root, text设定时间分钟, font(Microsoft YaHei, 11)).pack(pady10) self.entry tk.Entry(root, width20, font(Microsoft YaHei, 12)) self.entry.pack() btn_frame tk.Frame(root) btn_frame.pack(pady15) tk.Button(btn_frame, text开始定时, width10, commandself.start).grid(row0, column0, padx5) tk.Button(btn_frame, text取消关机, width10, commandself.cancel).grid(row0, column1, padx5) tk.Button(btn_frame, text退出, width10, commandroot.destroy).grid(row0, column2, padx5) self.status tk.Label(root, text当前未设置定时, fggray) self.status.pack(pady10) def start(self): try: minutes float(self.entry.get()) if minutes 0: raise ValueError(时间必须大于 0) self.remaining int(minutes * 60) subprocess.run([shutdown, /s, /f, /t, str(self.remaining)], checkTrue) self.status.config(textf已设置 {int(minutes)} 分钟后关机, fggreen) self.update_countdown() except Exception: messagebox.showerror(输入错误, 请输入大于 0 的数字) def cancel(self): subprocess.run([shutdown, /a], capture_outputTrue, textTrue, encodinggbk) self.status.config(text已取消定时关机, fgorange) if self.after_id: self.root.after_cancel(self.after_id) self.after_id None def update_countdown(self): if self.remaining 0: self.status.config(textf剩余 {self.remaining} 秒, fggreen) self.remaining - 1 self.after_id self.root.after(1000, self.update_countdown) if __name__ __main__: root tk.Tk() ShutdownTimer(root) root.mainloop()这段代码的逻辑并不复杂。start 方法读取输入框的分钟数转换成秒后调用 shutdown /s /f /t 设置系统定时关机随后启动一个每秒刷新一次的倒计时循环。这里的核心机制是 root.after(1000, self.update_countdown)它让 tkinter 每隔 1000 毫秒调用一次更新函数同时又不会阻塞界面主循环。千万不要用 time.sleep(1) 来做倒计时那会让窗口整个卡死用户点任何按钮都没反应。想让这个工具更贴近真实使用可以把文件后缀改成 .pyw这样双击运行时不会弹出黑色控制台窗口只显示 GUI 界面。如果身边同事电脑没装 Python你还可以用 PyInstaller 把它打包成独立的 exe 文件打包命令大概是 pyinstaller -F -w timer.pyw-F 表示单文件-w 表示不显示控制台。我给不懂电脑的长辈做过一个界面里只有一个数字输入框和两个按钮他们用起来完全不费劲。4.6 各种 Python 写法到底怎么选做一个简单的选型对比方便你按实际情况决定写法优点缺点适用场景os.system代码最少直观无法捕获输出参数易踩坑随手临时用subprocess健壮、可控、能判断结果代码稍长日常脚本、自动化任务ctypes直接调系统 API可自定义提示语需要管理员权限排查难系统工具开发tkinter GUI可视化、适合给别人用需要处理界面逻辑、打包发布给普通用户我的原则是能用 subprocess 就不用 os.system能不用 ctypes 就不用 ctypes。底层方案看着高级但对绝大多数定时关机需求来说属于过度设计。GUI 适合最终交付场景但如果只是你自己在电脑上偶尔用一次命令行输入 shutdown /s /t 3600 反而更直接。5. 倒计时提示、取消机制与开机自启的组合应用5.1 别让它关得无声无息给用户留出缓冲时间shutdown 命令自带的延时其实就是一个缓冲系统会在桌面右下角弹出通知告诉用户Windows 将在一小时后关闭。但在全屏玩游戏或者看视频的时候这个通知很容易被忽略。如果你不希望用户毫无准备地被打断可以在设置关机时留出足够的时间比如直接给 600 秒缓冲让用户看到倒计时后主动保存文件。用 Python 写 GUI 工具时倒计时本身就在界面上显示这个问题已经解决了。但如果你用的是后台脚本还想在关机前几分钟弹窗提醒可以用 threading.Timer 做一次延时提示比如设置 3600 秒后关机同时让脚本在第 3300 秒时弹一个 messageboxshutdown 前 5 分钟弹窗提示。代码思路大概是这样import threading import tkinter as tk from tkinter import messagebox import subprocess def remind(): root tk.Tk() root.withdraw() messagebox.showwarning(即将关机, 还有 5 分钟关机请保存工作内容) root.destroy() def schedule_with_remind(seconds): subprocess.run([shutdown, /s, /f, /t, str(seconds)], checkTrue) if seconds 300: threading.Timer(seconds - 300, remind).start() schedule_with_remind(3600)需要注意messagebox 调用里面临时创建了一个隐藏的 root 窗口这是 tkinter 弹窗的常见做法否则会报no display name之类的错误。这个机制很适合公司在公用电脑上设置下班自动关机给还在加班的人一个最后保存的时间窗口。5.2 取消定时关机的正确姿势取消定时关机最常用的是 shutdown /a 命令但你得搞清楚它的生效边界。shutdown 命令设置的延时关机在倒计时结束之前执行 shutdown /a 都能取消但如果倒计时已经走完系统已经在执行关机流程了再去执行 shutdown /a 就来不及了。另外由任务计划程序触发的 shutdown.exe 关机任务同样不能用 shutdown /a 取消因为计划任务触发的是立即执行的 shutdown.exe它并不会注册一个可取消的关机计划。遇到这种情况正确做法是在任务计划程序里停用或删除对应任务。还有一个常见误区是命令行设置的延时关机电脑重启之后会消失但任务计划程序里的定时任务重启之后依然会按计划触发。这两种行为的差异来自它们实现定时的层级不同前者是系统内存中的一个关机计划后者是持久化的任务定义。理解了这个差异你就知道为什么每天固定关机必须交给计划任务。5.3 每天定时关机的轻量常驻方案如果不是在服务器上而只是个人电脑想做到每天 23 点自动关机又不想手动创建任务计划可以写一个常驻后台的 Python 脚本。它的逻辑很简单循环检查当前时间到达设定时间就执行关机使用主循环加 sleep 的方式控制频率避免空转import time import subprocess import datetime def auto_shutdown_at(hour23, minute0): while True: now datetime.datetime.now() if now.hour hour and now.minute minute: subprocess.run([shutdown, /s, /f, /t, 60], checkTrue) break time.sleep(20) if __name__ __main__: auto_shutdown_at(23, 0)把脚本放到开机自启目录里方法是按 Win R 输入 shell:startup 并回车然后把脚本的快捷方式放进去。这个方案胜在灵活比如你可以加入如果是周末就不关如果某个程序正在运行就推迟之类的条件这就是 Python 相对计划任务的最大优势。但注意常驻脚本要轻量不要频繁进行高开销操作sleep(20) 已经足够满足精度要求。我也遇到过有人把这个循环的 sleep 写成 1 秒导致电脑风扇狂转的案例完全没必要。6. 实测中的常见坑输入参数、权限与编码6.1 参数设置最容易翻车的地方先列几个我见过无数次的参数错误。第一/t 的单位是秒不是分钟也不是小时3600 才是 1 小时如果你填 60 想表达1 小时后关机实际会在 1 分钟后关机。第二/f 会强制关闭所有正在运行的程序如果你有未保存的 Word 文档强关之后大概率找不回来所以设置之前先确认没有重要文档处于打开状态。第三在任务计划程序里参数要填到添加参数栏不要连程序名一起写在程序或脚本栏。第四shutdown /a 只能取消 shutdown /s 设置的定时不能取消计划任务触发后已经开始执行的关机流程。还有一个细节是 shutdown /i。这个参数会打开一个图形界面的关机设置窗口可以添加多台远程电脑、设置注释适合内网管理员批量关机。但它需要相应权限跨机器操作时经常遇到拒绝访问所以个人用户基本用不上。如果你想在命令行里看 shutdown 的所有参数说明执行 shutdown /? 就能看到完整帮助。6.2 拒绝访问多半是权限问题有朋友跟我反馈运行脚本时提示拒绝访问但同样的命令在别人的电脑上就能成功这通常是权限问题。shutdown /s /t 这条命令在普通权限的命令行窗口里一般能执行但如果你用的是 ctypes 直接调用 Windows API或者通过 WMI 的 Win32Shutdown就非常依赖管理员权限。遇到拒绝访问时第一步应该尝试以管理员身份运行命令提示符在开始菜单搜索 cmd右键选择以管理员身份运行再执行一次命令。任务计划程序也有类似的权限坑。你创建任务时如果账号是标准用户或者任务属性里没有勾选使用最高权限运行某些关机操作可能会被安全策略拦截。我在公司电脑上配置每天关机任务时特意在常规选项卡里勾选了使用最高权限运行并且在条件选项卡里取消只有在计算机使用交流电源时才启动此任务的勾选这样台式机和笔记本都能稳定触发。6.3 中文乱码和路径空格的连锁反应用 Python 调用 shutdown 时最隐蔽的问题不是命令本身而是编码。Windows 中文系统的命令行输出通常是 GBK 编码如果你的 Python 程序用默认 UTF-8 去捕获打印出来的提示信息就会是一堆乱码。我在 subprocess 示例里用了 encodinggbk, errorsignore就是专门处理这种情况。写 bat 文件时同样要小心如果保存成 UTF-8 编码但脚本里没有 chcp 65001中文提示可能乱码有些老系统对带 BOM 的 UTF-8 还特别敏感。我的经验是bat 文件尽量用系统自带记事本另存为 ANSI 编码这样最稳。路径带空格的问题主要出现在你把 shutdown.exe 的完整路径写进参数的情况。比如你在代码里写 C:\Program Files\Something\shutdown.exe 这种字符串一旦没有正确加引号系统就会把路径按空格拆成多个部分命令直接失效。用 subprocess 的列表传参就能绕开这个麻烦因为列表里每个元素都是独立参数不需要你手动处理空格。6.4 一个典型排错复盘为什么我设置了却没关机最后这段是我自己排查问题的复盘希望能帮你少走弯路。现象一命令行执行 shutdown /s /t 3600 后完全没反应。先别慌检查命令是否真的执行成功系统托盘有没有弹出通知如果通知显示将在 1 小时后关闭那说明已经生效只是你没注意。现象二提示找不到程序或者命令语法错误。检查 /t 后面是否写了数字中间有没有漏空格shutdown 和 /s 之间至少要有一个空格。现象三提示拒绝访问。参考上一节的权限处理先提权再试。现象四计划任务到点了电脑没关机。打开任务计划程序查看任务状态重点是检查触发器时间是否正确、任务是否处于就绪状态、是否勾选了使用最高权限运行、电脑当时是否处于关机或睡眠状态。如果确认关机命令发出但系统没有关可以打开事件查看器在 Windows 日志下的系统里筛选事件 ID 1074这个事件记录了关机发起者和原因。我排查过一台总是到点不关的电脑最后发现是某杀毒软件拦截了 shutdown.exe 调用在事件日志里能看到明显的拦截记录。遇到这种情况把 executor 加入白名单即可。7. 定时关机之外可以顺手扩展的自动化玩法7.1 监控某个进程结束后自动关机定时关机最常见的一个应用变体是任务完成后自动关机。比如你正在跑一个视频渲染预计半小时到一小时不等或者要大文件拷贝拷贝时间取决于磁盘速度。这种场景下固定延时并不理智更聪明的做法是让 Python 持续监控目标进程一旦进程消失就执行关机。用 psutil 库实现起来非常直观pip install psutilimport psutil import subprocess import time target input(请输入要监控的进程名例如 render.exe).strip().lower() while True: found any( p.name().lower() target for p in psutil.process_iter([name]) ) if not found: subprocess.run([shutdown, /s, /f, /t, 60], checkTrue) break time.sleep(10)这段脚本每 10 秒检查一次目标进程是否还在一旦发现进程结束就给系统发送一个 60 秒后的关机命令给你留出点反应时间。我在跑视频转码时经常用这个方式转码程序像镭射枪一样精准脚本就像守在旁边的助手转码一停电脑就关。比盯着进度条靠谱多了。7.2 电脑空闲超过一定时间自动关机还有一种需求是我不在电脑前一段时间就自动关机适合那些经常忘关电脑的人。实现思路是检测系统最后输入时间鼠标或键盘超过 N 分钟没有动作就触发关机。Windows 的 GetLastInputInfo API 可以拿到当前会话的上次输入时间Python 可以用 ctypes 调用。思路至少要先有不断获取 idle 秒数如果大于阈值就执行 shutdown同时避免脚本误判比如在播放视频时没有键盘鼠标动作但系统并不空闲。这个场景比单纯定时关机复杂一点点但本质还是条件满足后再调 shutdown。7.3 下载任务、渲染任务结束自动关机的通用套路无论是下载大文件、转码、跑数据还是备份只要任务完成时间不确定都可以套用同一个模板先定义任务结束的判断条件再用循环去轮询条件满足后执行关机。判断条件可以是进程消失、某个文件大小不再变化、某个目录里出现了特定后缀的新文件、网络流量下降等等。这种条件触发 关机的组合才是定时关机概念真正的进阶方向。我自己测过一段检测文件大小是否还在增长的脚本逻辑是每隔 30 秒对比目标文件大小如果连续两次一致就认为下载或复制已经结束然后关机。这类脚本写起来不难但要注意轮询间隔不要太短避免脚本占用过多磁盘资源。30 秒到 60 秒是比较合理的间隔。如果你今天只想记住一句话那就是临时关机用 shutdown /s /t 3600长期固定关机用任务计划程序需要条件触发就上 Python。在我给朋友装机的经验里80% 的定时关机需求一条命令就解决了剩下的 20% 才需要写脚本。你先从最简单的命令开始跑通再根据自己的使用习惯决定要不要升级成工具这样既不会过度工程也能真正把这件小事变成日常习惯。
返回列表