BAT的一个定时关机脚本

– 写这个脚本的目的主要是感觉Windows自带的shutdown -s -t参数是秒,而对于大多数使用场景,我更需要的是在特定的时间自动关机,这就需要程序自动计算当前时间和目标时间的时间间隔,并转换成秒。
– 当然也有同学使用 at 命令在Windows自带计划任务库中添加计划任务,但是这种方法需要请求管理员权限,虽然代码简单,输入参数可以是24小时格式的时间,但是操作过程有点繁琐,需要请求高权限,如果给别人使用时给用户一种很不安全的感觉,个人还是希望使用shutdown命令还是较好的选择,而且在设置成功后系统会提示关机计划。
因此,我希望能够编写一个利用shutdown命令的自动关机程序,输入参数是计划关机的时间点,采用24小时格式输入。


::定时关机脚本
::Author:Tony Chang
::2016.10.18
::原创代码,转载请注明出处
@echo off
mode con lines=25
setlocal enabledelayedexpansion
title 定时关机
color 1f
cls
set "timeGoal= 21:15"

echo.
echo.
echo.
echo 时间使用24小时制(如2:15),默认关机时间为:%timeGoal%
echo.
echo 取消已有关机计划 按N;
echo.
echo.当前时间 %time:~0,5%
echo.
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
echo.

set /p "timeGoal= 请输入关机时间:"
echo.
if %timeGoal%==N goto cancel
if %timeGoal%==n goto cancel

set tmp=%timeGoal%
::将"号替换成空格
set /a num = 0
set "tmp=%tmp:"= %"
:next
if not "%tmp:~0,1%"==":" (
 set /a num+=1
 set "tmp=%tmp:~1%"
 goto next
)
set  /a hourNow = %time:~0,2%
set  /a minuteNow = %time:~3,2%
set  /a secNow = %time:~6,2%
set  /a hourGoal =!timeGoal:~0,%num%!
set /a num+=1
set  /a minuteGoal = !timeGoal:~%num%,2!
set  /a "diffT = hourGoal - hourNow"

::diffT<0;
if %diffT% lss 0 (
echo 将设置为明天%timeGoal%关机
set  /a "diffT = diffT + 24"
)
set  /a "diffT = diffT*3600+(minuteGoal-minuteNow)*60 - secNow"
if %diffT% lss 0 (
echo 将设置为明天%timeGoal%关机
set  /a "diffT = diffT + 86400"
)
shutdown -s -t %diffT%
echo 已设置%timeGoal%的关机计划
goto exit

:cancel
shutdown -a
echo 已取消当前设定
goto exit

:exit
echo.
echo 3秒后退出……
choice /t 3 /d y /n >nul

代码写的简单,因为不是很熟悉BAT的编程,一些变量的用法也有些乱,但是基本功能是实现。

  • 自定义关机时间;
  • 在无输入的情况下,默认关机时间。(有时候需要偷偷离开一下,又怕实验室老板发现,就需要在实验室下班前保持电脑开启,下班时自动关机,这个功能是专门为我这种懒人定制的~~~~;-));
  • 取消已有关机计划;
  • 计划设定结果显示;

实现流程就是获取目标时间和当前时间,求差,判断是否是当天任务,将时间差转换成秒后调用 shutdown命令。有一个小trick,在获取输入时间,会有不同长度的输入,如2:15,15:40。为了解决这一问题,由于不是很熟悉BAT字符串操作,采取了比较笨的办法,从头遍历字符串,直到找到:符号停止,记录长度num。
代码如下:

set tmp=%timeGoal%
::将"号替换成空格
set /a num = 0
set "tmp=%tmp:"= %"
:next
if not "%tmp:~0,1%"==":" (
 set /a num+=1
 set "tmp=%tmp:~1%"
 goto next
)

求得的参数在截取小时和分钟时也有些不一样的用法,使用了%和!来表示变量。
解释:
如果使用行内或括号内定义或修改的变量,需要启用延迟变量扩充,用叹号引用变量。bat文件中用 setlocal enabledelayedexpansion 启用延迟变量扩充,命令提示符窗口启用延迟变量扩充

setlocal enabledelayedexpansion
set  /a hourGoal =!timeGoal:~0,%num%!
set /a num+=1
set  /a minuteGoal = !timeGoal:~%num%,2!

实现默认输入参数值:

set "timeGoal= 21:15"
set /p "timeGoal= 请输入关机时间:"

运行结果图

(0)

相关推荐