批处理脚本计划/重计划关机的功能优化及问题咨询
解决定时关机脚本的功能扩展及疑问解答
首先,先解答你的疑问:为什么shutdown /s /t计划的关机不会出现在Windows 10的Task Scheduler中?
shutdown.exe /s /t <seconds>创建的定时关机是Windows系统内核级的临时计时器,由系统进程(比如winlogon.exe)管理,并非通过Task Scheduler创建的持久化任务。它本质上是一个一次性的延迟关机指令,不会在任务计划器中生成可查的任务条目。如果需要持久化的重复关机任务,才需要通过Task Scheduler或schtasks命令创建。
修改后的完整脚本
下面是整合了你所有需求的脚本,已经实现:
- 启动时检测并显示当前激活的关机计划及时间
- 处理重新计划时的报错问题
- 输入
List查看所有单次/重复关机任务 - 支持添加、删除、编辑单个关机任务
@echo off setlocal enabledelayedexpansion :: 检查当前是否有激活的关机计划 :CHECK_SHUTDOWN cls echo ====================================== echo 当前系统关机计划状态 echo ====================================== :: 检查shutdown.exe的定时关机计划 set "has_shutdown=0" for /f "tokens=*" %%a in ('tasklist /v /fi "imagename eq shutdown.exe" /fo list ^| findstr /i "Command Line"') do ( set "cmd_line=%%a" :: 提取/t参数后的秒数 set "delay=!cmd_line:* /t =!" set "delay=!delay:~0,-1!" if defined delay ( set /a "minutes=delay/60" :: 计算关机时间(当前时间+延迟) for /f "tokens=1-4 delims=/: " %%b in ('echo %time%') do ( set /a "current_hour=%%b", "current_min=%%c", "current_sec=%%d" set /a "total_sec=current_hour*3600 + current_min*60 + current_sec + delay" set /a "shutdown_hour=total_sec/3600", "remaining_sec=total_sec%%3600" set /a "shutdown_min=remaining_sec/60", "shutdown_sec=remaining_sec%%60" :: 处理跨天情况 if !shutdown_hour! geq 24 set /a "shutdown_hour-=24" :: 格式化时间 if !shutdown_hour! lss 10 set "shutdown_hour=0!shutdown_hour!" if !shutdown_min! lss 10 set "shutdown_min=0!shutdown_min!" if !shutdown_sec! lss 10 set "shutdown_sec=0!shutdown_sec!" ) echo ✅ 存在单次定时关机计划: echo 将在 !minutes! 分钟后(%date% !shutdown_hour!:!shutdown_min!:!shutdown_sec!)关机 set "has_shutdown=1" ) ) :: 检查Task Scheduler中的重复关机任务 echo. echo 任务计划器中的重复关机任务: schtasks /query /fo table /v | findstr /i "shutdown" >nul if errorlevel 1 ( echo ❌ 未找到重复关机任务 ) else ( schtasks /query /fo list /v | findstr /i "TaskName: Next Run Time:" ) echo ====================================== echo. timeout /t 3 /nobreak >nul goto :MAIN :INVALID echo X = "%input01%" 是无效输入,请重新输入。 timeout /t 5 >nul goto :MAIN :NOW echo 立即执行关机操作... C:\Windows\System32\shutdown /s pause goto :MAIN :STOP echo 尝试取消所有激活的关机计划... echo. :: 取消shutdown的定时关机 C:\Windows\System32\shutdown /a 2>NUL if NOT ERRORLEVEL 1116 ( echo ✅ 已取消单次定时关机计划 ) else ( echo ℹ️ 没有正在执行的单次关机计划(错误码1116) ) :: 提示用户是否取消任务计划器中的任务 set /p "cancel_schtask=是否取消任务计划器中的关机任务?(Y/N): " if /i "!cancel_schtask!"=="Y" ( for /f "tokens=2 delims=:" %%a in ('schtasks /query /fo list /v ^| findstr /i "TaskName:"') do ( set "task_name=%%a" set "task_name=!task_name: =!" schtasks /delete /tn "!task_name!" /f >nul if !errorlevel! equ 0 echo ✅ 已删除任务:!task_name! ) ) timeout /t 10 >nul goto :MAIN :LIST_TASKS cls echo ====================================== echo 所有关机任务详情 echo ====================================== echo. :: 显示单次定时关机 call :CHECK_SHUTDOWN echo. echo -------------------------------------- echo 任务计划器中的关机任务详情: schtasks /query /fo table /tn *shutdown* /v echo. echo 按任意键返回主菜单... pause >nul goto :MAIN :ADD_TASK cls echo ====================================== echo 添加重复关机任务 echo ====================================== set "task_name=" set "run_time=" set "run_day=" set /p "task_name=请输入任务名称(建议包含shutdown):" set /p "run_time=请输入关机时间(格式HH:MM):" set /p "run_day=请输入执行周期(D=每日, W=每周):" if /i "!run_day!"=="D" ( schtasks /create /tn "!task_name!" /tr "shutdown /s /f" /sc daily /st !run_time! /f ) else if /i "!run_day!"=="W" ( schtasks /create /tn "!task_name!" /tr "shutdown /s /f" /sc weekly /st !run_time! /f ) else ( echo 无效的周期输入,请返回主菜单重新操作。 timeout /t 5 >nul goto :MAIN ) if !errorlevel! equ 0 ( echo ✅ 任务创建成功! ) else ( echo ❌ 任务创建失败,请检查输入格式。 ) timeout /t 5 >nul goto :MAIN :DELETE_TASK cls echo ====================================== echo 删除关机任务 echo ====================================== echo 当前任务计划器中的关机任务: schtasks /query /fo table /tn *shutdown* set "task_name=" set /p "task_name=请输入要删除的任务名称:" schtasks /delete /tn "!task_name!" /f if !errorlevel! equ 0 ( echo ✅ 任务删除成功! ) else ( echo ❌ 任务不存在或删除失败。 ) timeout /t 5 >nul goto :MAIN :EDIT_TASK cls echo ====================================== echo 编辑关机任务 echo ====================================== echo 当前任务计划器中的关机任务: schtasks /query /fo table /tn *shutdown* set "task_name=" set "new_time=" set /p "task_name=请输入要编辑的任务名称:" set /p "new_time=请输入新的执行时间(格式HH:MM):" schtasks /change /tn "!task_name!" /st !new_time! if !errorlevel! equ 0 ( echo ✅ 任务编辑成功! ) else ( echo ❌ 任务不存在或编辑失败。 ) timeout /t 5 >nul goto :MAIN :MAIN cls echo JimmyWilliams - 20180523(功能扩展版) echo. echo 此脚本可设置定时关机、管理关机任务,支持以下操作: echo. echo 1. 输入正整数X:设置X分钟后自动关机(覆盖现有单次计划) echo 2. 输入 "Stop":取消所有激活的关机计划 echo 3. 输入 "List":查看所有单次/重复关机任务详情 echo 4. 输入 "Add":添加重复关机任务(每日/每周) echo 5. 输入 "Delete":删除指定的重复关机任务 echo 6. 输入 "Edit":编辑重复关机任务的执行时间 echo 7. 输入 "Quit":退出程序 echo. set "input01=" set "ExVal01=" set /p "input01=请输入操作指令:X = " if "%input01%"=="" goto :INVALID :: 处理指令分支 if /i "%input01%"=="Quit" goto :QUIT if /i "%input01%"=="Stop" goto :STOP if /i "%input01%"=="List" goto :LIST_TASKS if /i "%input01%"=="Add" goto :ADD_TASK if /i "%input01%"=="Delete" goto :DELETE_TASK if /i "%input01%"=="Edit" goto :EDIT_TASK :: 处理数字输入(定时关机) set /a ExVal01="%input01%"*60 if %input01%==0 goto :NOW if %ExVal01%==0 goto :INVALID if %input01% LSS 0 goto :INVALID :: 设置定时关机,处理重新计划报错 C:\Windows\System32\shutdown /s /t %ExVal01% 2>NUL if ERRORLEVEL 1190 ( echo ℹ️ 检测到已有定时关机计划,正在重新设置... C:\Windows\System32\shutdown /a >nul C:\Windows\System32\shutdown /s /t %ExVal01% echo ✅ 已重新计划为 %input01% 分钟后关机 ) ELSE ( echo ✅ 已设置为 %input01% 分钟后关机 ) timeout /t 10 >nul goto :MAIN :QUIT echo 正在退出程序... pause exit /b
功能实现说明
启动时检测关机计划
- 通过
tasklist /v查找shutdown.exe进程,解析其命令行参数中的延迟时间,计算出精确的关机时间并显示 - 同时查询Task Scheduler中包含"shutdown"关键词的任务,展示重复关机计划
- 通过
解决重新计划报错
- 保留了
2>NUL屏蔽错误输出,同时针对错误码1190(已有定时关机)的情况,先执行shutdown /a取消原计划,再重新设置新的定时关机,避免报错
- 保留了
List命令查看所有任务
- 整合了单次关机计划和Task Scheduler中的重复任务,用表格形式展示详细信息,包括任务名称、下次执行时间等
任务管理功能
Add:创建每日/每周的重复关机任务,使用schtasks命令生成持久化任务Delete:根据任务名称删除指定的重复关机任务Edit:修改现有重复任务的执行时间
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

