koi1 发表于 2024-1-2 17:14

at命令已被弃用,自用批处理自定时关机

本帖最后由 koi1 于 2024-3-13 10:44 编辑

某一天在win10需要用at shutdown -s 来定时关机时发现at命令已被弃用。于时才写了这个。
自定关机.bat
```
@echo off
title 自定时间关机 & color 02 & mode con: COLS=60 LINES=20
echo.
goto chooseday
:setdown
set nxdy=%1
set s=0
set m=0
set h=0
set seth=0
set setm=0
setab=关机时间:
setabb=现在时间:
setab1=后关机,设定后若重启无效
set bc1=取消关机:shutdown -a
echo.
set /p seth=输入要关机的时:
if %nxdy% equ 0 (
call:isint %seth% 1 0 )
if %nxdy% equ 1 (
call:isint %seth% 1 1 )
set /p setm=输入要关机的分:
if %nxdy% equ 0 (
call:isint %setm% 2 0 )
if %nxdy% equ 1 (
call:isint %setm% 2 1 )


seth1=%time:~0,2%
setm1=%time:~3,2%
sets1=%time:~6,2%

if %nxdy% equ 0 if %seth% lss %h1% (
echo. 只能设定当天的
goto chooseday )
if %nxdy% equ 0 if %seth% equ %h1% (
if %setm% lss %m1% (
echo. 只能设定当天的
goto chooseday ) )
CLS
if %nxdy% equ 0 (
set /a needh=%seth%-%h1% )
if %nxdy% equ 1 (
    set /a needh=24-%h1%+%seth%)
if %setm% lss %m1% (
set /a needh=%needh%-1
set /a needm=%setm%+60-%m1% )
if %setm% geq %m1%(set /a needm=%setm%-%m1%)
set /a hs=%needh%*60*60
set /a ms=%needm%*60
set /a needs=%hs%+%ms%-%s1%
echo.
echo.    %abb% %h1%:%m1%:%s1%
echo.    %needh%时%needm%分%ab1%
echo.    %ab% %seth%:%setm%
echo.   
echo.
shutdown -s -f -t %needs%
goto chooseday

:canceldown
shutdown -a
set cc=已取消关机
if %errorlevel% equ 0 (
echo. %cc% )

goto chooseday

:mychooce1
set /p mysel=设置/取消关机(Y/N):
if "%mysel%" == "Y" (call:setdown 0 )
if "%mysel%" == "y" (call:setdown 0 )
if "%mysel%" == "N" (goto canceldown )
if "%mysel%" == "n" (goto canceldown )
goto mychooce1

:mychooce2
set /p mysel=设置/取消关机(Y/N):
if "%mysel%" == "Y" (call:setdown 1 )
if "%mysel%" == "y" (call:setdown 1 )
if "%mysel%" == "N" (goto canceldown )
if "%mysel%" == "n" (goto canceldown )
goto mychooce2

:chooseday
set dp=%~dp0
::set ndy=nextdy.bat
set atk=stdwtask.bat
set /p daysel=选择当日/跨日/计划任务每天,定时关机(D/M/E):
if "%daysel%" == "D" ( goto mychooce1 )
if "%daysel%" == "d" ( goto mychooce1 )
if "%daysel%" == "M" ( goto mychooce2 )
if "%daysel%" == "m" ( goto mychooce2 )
if "%daysel%" == "E" ( call %dp%%atk% )
if "%daysel%" == "e" ( call %dp%%atk% )
goto chooseday

:isint
set intst=%1
set hm=%2
set dyy=%3
set /a isn=intst
if %isn% neq %intst% (
echo. 不是整数,重新输入
if %dyy% equ 0 (
call:setdown 0 ) else (
call:setdown 1)
) else (
if %intst% lss 0 (
    echo. 小于0,重新输入
    if %dyy% equ 0 (
    call:setdown 0 ) else (
    call:setdown 1)
)
if %hm% equ 1 (
if %intst% geq 24 (
    echo. 大于等于24,重新输入
    if %dyy% equ 0 (
    call:setdown 0 ) else (
    call:setdown 1)
   )
)
if %hm% equ 2 (
if %intst% geq 60 (
    echo. 大于等于60,重新输入
    if %dyy% equ 0 (
    call:setdown 0 ) else (
    call:setdown 1)
   )
)


)
goto eof

:eof

```
运行图:



第三个选项计划任务每天定时关机脚本在17楼

侃遍天下无二人 发表于 2024-1-2 19:00

一般来说,假定我在下载文件,预计30分钟后完成,那么我可以给一个小时的时间,以防万一,这时候直接用shutdown -s -t 3600就差不多了

koi1 发表于 2024-1-3 10:12

本帖最后由 koi1 于 2024-1-3 10:17 编辑

里面的第三个选项每天计划任务的批处理也放上来吧。单独运行这个来设置计划任务也可以,不过这个要管理员身份运行。
stdwtask.bat

```
@echo off
title 计划任务关机 & color 02 & mode con: COLS=60 LINES=20
echo.
net session >nul 2>&1
if %errorLevel% == 0 ( set adm="adm" ) else ( set adm="notadm" )
goto ychoose
:createdown
set s=0
set m=0
set h=0
setab=关机时间:

echo.
set /p "seth=输入要关机的时:"
call:isint %seth%
if %seth% lss 10 ( set "seth=0%seth%" )

set /p setm=输入要关机的分:
call:isint %setm%
if %setm% lss 10 ( set "setm=0%setm%" )


schtasks /create /tn "myshtdown" /tr "shutdown /s /f /t 0" /sc daily /st %seth%:%setm%:00 /ru System
if %errorlevel% equ 0 ( echo. 创建计划任务:myshtdown )
if %errorlevel% equ 1( echo. 权限不够,请右键以管理员身份运行 )
if %errorlevel% equ 5( echo. 被用户或者杀软阻止 )
if %errorlevel% equ -2147467259 ( echo. 输入了无效的时或分 )
goto ychoose

:disdown
schtasks /change /tn "myshtdown" /disable
if %errorlevel% equ 0 ( echo. 已禁用计划任务:myshtdown )

if %errorlevel% equ 1 if %adm% == "notadm"( echo. 或权限不够,请右键以管理员身份运行 )

goto ychoose

:abldown
schtasks /change /tn "myshtdown" /enable
if %errorlevel% equ 0 ( echo. 已启用计划任务:myshtdown )

if %errorlevel% equ 1 if %adm% == "notadm"( echo. 或权限不够,请右键以管理员身份运行 )
goto ychoose

:ychoose
set /p selc=创建/禁用/启用计划任务(C/D/A):
if "%selc%" == "C" ( goto createdown )
if "%selc%" == "c" ( goto createdown )
if "%selc%" == "D" ( goto disdown )
if "%selc%" == "d" ( goto disdown )
if "%selc%" == "A" ( goto abldown )
if "%selc%" == "a" ( goto abldown )
goto ychoose

:isint
set intst=%1
set /a isn=intst
if %isn% neq %intst% (
echo. 不是整数,重新输入
goto createdown
) else (
if %intst% lss 0 (
    echo. 小于0,重新输入
    goto createdown
)

)
goto eof

:eof
```

WGL 发表于 2024-1-2 22:15

感谢分享,我用win11新建文本文档改后缀运行显示乱码,在开头添加指定脚本文件的编码命令就正常了。

@echo off
chcp 65001

Batcher 发表于 2024-1-2 21:30

推荐使用 schtasks 命令创建任务计划
https://mp.weixin.qq.com/s/LKTmJuq45bZbxoGVTfla1w

菜鸟豪哥 发表于 2024-1-2 19:52

shutdown -s -t 就挺好用

lcg2014 发表于 2024-1-2 20:27

windows就是半成品

koi1 发表于 2024-1-2 21:48

菜鸟豪哥 发表于 2024-1-2 19:52
shutdown -s -t 就挺好用

核心就是这个shutdown -s -t ,不过我用它实现at命令一种方法

koi1 发表于 2024-1-2 21:49

本帖最后由 koi1 于 2024-1-2 21:57 编辑

Batcher 发表于 2024-1-2 21:30
推荐使用 schtasks 命令创建任务计划
https://mp.weixin.qq.com/s/LKTmJuq45bZbxoGVTfla1w
脚本也有用到这个,觉得不是很必要没放上来,可能多数是某次要定时关机不是每天。

koi1 发表于 2024-1-2 21:52

本帖最后由 koi1 于 2024-1-2 21:54 编辑

侃遍天下无二人 发表于 2024-1-2 19:00
一般来说,假定我在下载文件,预计30分钟后完成,那么我可以给一个小时的时间,以防万一,这时候直接用shut ...
发现没有at了我第一时间是想用什么可以代替,最后我只想到以上用shutdown -s -t 实现at命令的一种方法写出来。并且更傻瓜式了,给不会用命令的同事也能用了。:Dweeqw

luanshils 发表于 2024-1-3 01:01

本帖最后由 luanshils 于 2024-1-3 01:04 编辑

WGL 发表于 2024-1-2 22:15
感谢分享,我用win11新建文本文档改后缀运行显示乱码,在开头添加指定脚本文件的编码命令就正常了。

@ec ...
这个问题是编码问题,就是gbk,ansi之类的。你另存为改成ansi试试,顺便说,系统默认创建 的记事本的字符编码好像都是那一个(就是会中文乱码的那个)
页: [1] 2 3
查看完整版本: at命令已被弃用,自用批处理自定时关机