从入门到精通的完整指南(附代码)
目录导读
- 为什么需要自动关机脚本?——场景与痛点分析
- 前置准备:Windows/macOS/Linux 环境差异说明
- 核心脚本写法详解(附可复制代码)
- 1 Windows(批处理 + PowerShell)
- 2 macOS / Linux(Bash + AppleScript)
- 如何实现"关机前弹窗提醒"?——3种交互方案
- 进阶技巧:定时任务 + 日志记录 + 取消机制
- 常见问题问答(FAQ)
- 安全提示与最佳实践
为什么需要自动关机脚本?——场景与痛点分析
你是否遇到过这些情况:下载大文件到深夜、视频渲染需要几个小时、系统更新后忘记关机、或者想给孩子设置电脑使用时间限制?手动等待关机不仅浪费时间,还可能因疏忽导致设备整夜运行,浪费电力并加速硬件老化。

脚本自动关机的核心价值在于:将"人工盯着"变为"系统自动判断",你可以设定"当备份完成后30分钟自动关机",或者"每天23:50提醒并关机",更智能的脚本还能在关机前弹出对话框,让你选择"立即关机"或"取消",避免误操作。
注意:本文所有脚本均需以管理员/root权限运行,否则系统会拒绝执行关机命令。
前置准备:Windows/macOS/Linux 环境差异说明
| 系统 | 关机命令 | 提醒方式 | 调度工具 |
|---|---|---|---|
| Windows 10/11 | shutdown /s /t 60 |
msg * 或 PowerShell 弹窗 |
任务计划程序 |
| macOS | sudo shutdown -h +1 |
osascript -e 'display dialog' |
crontab / launchd |
| Linux (Ubuntu等) | sudo shutdown -h +1 |
notify-send 或 zenity |
crontab / systemd-timer |
关键点:Windows 的 shutdown /s 表示关机,/t 是延迟秒数;Linux/macOS 的 shutdown -h 后接 +分钟数(+1 表示1分钟后)。
核心脚本写法详解(附可复制代码)
1 Windows(批处理 + PowerShell)
场景:2小时后自动关机,并在最后5分钟弹窗提醒。
批处理(.bat)文件:
@echo off echo 系统将在 2 小时后自动关机。 echo 如需取消,请运行 shutdown /a shutdown /s /t 7200
增强版(带提醒):保存为 auto_shutdown.bat
@echo off
:: 设定关机延迟时间(秒):7200 = 2小时
set /a DELAY=7200
:: 提前5分钟(300秒)提醒
set /a REMIND=300
echo [信息] 将在 %DELAY% 秒后关机,提前 %REMIND% 秒弹窗提醒。
shutdown /s /t %DELAY%
:: 使用PowerShell在提醒时间弹出对话框
powershell -Command "Start-Sleep -Seconds %DELAY%-%REMIND%; [System.Windows.Forms.MessageBox]::Show('注意:系统将在5分钟后关机!如需取消,请运行 shutdown /a','关机提醒')"
提示:上述PowerShell命令需要 Add-Type -AssemblyName System.Windows.Forms,可在脚本开头加上,如果你觉得复杂,直接用 msg * 系统5分钟后关机 更简单(但无图形界面)。
2 macOS / Linux(Bash + AppleScript)
Linux(使用 notify-send 弹窗):
#!/bin/bash
# 设定120分钟后关机
DELAY_MIN=120
REMIND_MIN=5
echo "系统将在 ${DELAY_MIN} 分钟后关闭"
shutdown -h +${DELAY_MIN}
# 在提前5分钟时提醒(使用at命令或后台循环)
(sleep $(( (DELAY_MIN - REMIND_MIN) * 60 )) && notify-send "关机提醒" "5分钟后关机,按 Ctrl+C 可取消") &
macOS(使用 AppleScript 对话框):
#!/bin/bash
DELAY_MIN=120
REMIND_MIN=5
echo "将在 ${DELAY_MIN} 分钟后关机"
sudo shutdown -h +${DELAY_MIN} &
# 后台等待并弹窗
sleep $(( (DELAY_MIN - REMIND_MIN) * 60 ))
osascript -e 'display dialog "5分钟后关机" buttons {"取消","确定"} default button "确定"'
如何实现"关机前弹窗提醒"?——3种交互方案
方案A:Windows 原生 msg 命令(最简单)
msg * /TIME:0 "系统将在1分钟后关机,请保存工作!" shutdown /s /t 60
优点:无需额外软件;缺点:仅局域网用户可见,且样式古板。
方案B:PowerShell 图形弹窗(最推荐)
Add-Type -AssemblyName System.Windows.Forms
$result = [System.Windows.Forms.MessageBox]::Show('是否立即关机?','确认关机',[System.Windows.Forms.MessageBoxButtons]::YesNo)
if ($result -eq 'Yes') { shutdown /s /t 0 } else { shutdown /a }
你可以把这段PowerShell嵌入批处理中,实现倒计时弹窗选择。
方案C:Python 脚本(跨平台,灵活)
import os, time
import tkinter as tk
from tkinter import messagebox
# 设定30分钟后期关机
delay_sec = 1800
root = tk.Tk()
root.withdraw()
if messagebox.askokcancel("提醒", f"系统将在{delay_sec//60}分钟后关机\n是否取消?"):
os.system("shutdown /a") # Windows
else:
os.system("shutdown /s /t 0")
若你是编程新手,直接复制方案A即可;如果需要美观界面,用方案B。
进阶技巧:定时任务 + 日志记录 + 取消机制
(1)日志记录:在脚本中加入 echo %date% %time% >> C:\log\shutdown.log,可追踪每次关机操作。
(2)取消机制:随时运行 shutdown /a (Windows)或 sudo shutdown -c (Linux),建议提醒弹窗中明确告知用户。
(3)与定时任务结合(每天23:30执行):
- Windows:任务计划程序 -> 创建基本任务 -> 触发器“每天” -> 操作“启动程序”选择你的bat文件。
- Linux:
crontab -e添加30 23 * * * /path/to/script.sh
(4)防止误关:在脚本开头检查是否有活动进程(如 tasklist 中有渲染软件),若有则延迟关机。
常见问题问答(FAQ)
Q1:脚本运行后,如何取消已经计划的关机?
A:Windows 输入 shutdown /a;Linux/macOS 输入 sudo shutdown -c,若提醒弹窗中有“取消”按钮,点击即可。
Q2:为什么我的 shutdown 命令提示“拒绝访问”?
A:请用管理员身份运行脚本(右键“以管理员身份运行”),或 sudo 加前缀。
Q3:能否让提醒弹窗一直显示,直到用户点击? A:可以,上述PowerShell和Python方案均会阻塞脚本执行,只有当用户点击“确定”或“取消”后才会继续,因此默认就会显示到用户操作。
Q4:多系统环境下,脚本能否通用?
A:不能,务必按操作系统区分,但可以用 Python + platform 模块写跨系统脚本,但较复杂,不推荐初学者。
Q5:有没有图形化界面工具替代脚本? A:Windows 可用“关机助手”等小工具,但脚本更轻量、可控性更强。
安全提示与最佳实践
- 测试先行:先在虚拟机或非关键电脑上测试,切勿在工作电脑直接运行未测试脚本。
- 设置足够长的延迟(建议≥5分钟),并确保提醒清晰,防止数据丢失。
- 使用绝对路径:在定时任务中,脚本内部涉及的文件路径最好用绝对路径,避免相对路径错误。
- 权限最小化:Linux下脚本若需要root权限,建议仅将关机命令用sudo,其余部分普通权限即可。
- 备份脚本:将脚本放在用户目录或配置管理中,避免误删。
最后的话:自动关机脚本的本质是用规则的确定性对抗记忆的不可靠性,掌握上述方法后,你还可以扩展出“按CPU使用率降低后关机”“下载完成后关机”等高级玩法,让电脑成为懂你的智能管家。
(全文约1800字)