You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理脚本计划/重计划关机的功能优化及问题咨询

解决定时关机脚本的功能扩展及疑问解答

首先,先解答你的疑问:为什么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

功能实现说明

  1. 启动时检测关机计划

    • 通过tasklist /v查找shutdown.exe进程,解析其命令行参数中的延迟时间,计算出精确的关机时间并显示
    • 同时查询Task Scheduler中包含"shutdown"关键词的任务,展示重复关机计划
  2. 解决重新计划报错

    • 保留了2>NUL屏蔽错误输出,同时针对错误码1190(已有定时关机)的情况,先执行shutdown /a取消原计划,再重新设置新的定时关机,避免报错
  3. List命令查看所有任务

    • 整合了单次关机计划和Task Scheduler中的重复任务,用表格形式展示详细信息,包括任务名称、下次执行时间等
  4. 任务管理功能

    • Add:创建每日/每周的重复关机任务,使用schtasks命令生成持久化任务
    • Delete:根据任务名称删除指定的重复关机任务
    • Edit:修改现有重复任务的执行时间

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:46:36