– 寫這個腳本的目的主要是感覺Windows自帶的shutdown -s -t參數(shù)是秒,而對于大多數(shù)使用場景,我更需要的是在特定的時間自動關(guān)機,這就需要程序自動計算當(dāng)前時間和目標(biāo)時間的時間間隔,并轉(zhuǎn)換成秒。 – 當(dāng)然也有同學(xué)使用 at 命令在Windows自帶計劃任務(wù)庫中添加計劃任務(wù),但是這種方法需要請求管理員權(quán)限,雖然代碼簡單,輸入?yún)?shù)可以是24小時格式的時間,但是操作過程有點繁瑣,需要請求高權(quán)限,如果給別人使用時給用戶一種很不安全的感覺,個人還是希望使用shutdown命令還是較好的選擇,而且在設(shè)置成功后系統(tǒng)會提示關(guān)機計劃。 因此,我希望能夠編寫一個利用shutdown命令的自動關(guān)機程序,輸入?yún)?shù)是計劃關(guān)機的時間點,采用24小時格式輸入。
::定時關(guān)機腳本
::Author:Tony Chang
::2016.10.18
::原創(chuàng)代碼,轉(zhuǎn)載請注明出處
@echo off
mode con lines=25
setlocal enabledelayedexpansion
title 定時關(guān)機
color 1f
cls
set "timeGoal= 21:15"
echo.
echo.
echo.
echo 時間使用24小時制(如2:15),默認(rèn)關(guān)機時間為:%timeGoal%
echo.
echo 取消已有關(guān)機計劃 按N;
echo.
echo.當(dāng)前時間 %time:~0,5%
echo.
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
echo.
set /p "timeGoal= 請輸入關(guān)機時間:"
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 將設(shè)置為明天%timeGoal%關(guān)機
set /a "diffT = diffT + 24"
)
set /a "diffT = diffT*3600+(minuteGoal-minuteNow)*60 - secNow"
if %diffT% lss 0 (
echo 將設(shè)置為明天%timeGoal%關(guān)機
set /a "diffT = diffT + 86400"
)
shutdown -s -t %diffT%
echo 已設(shè)置%timeGoal%的關(guān)機計劃
goto exit
:cancel
shutdown -a
echo 已取消當(dāng)前設(shè)定
goto exit
:exit
echo.
echo 3秒后退出……
choice /t 3 /d y /n >nul
代碼寫的簡單,因為不是很熟悉BAT的編程,一些變量的用法也有些亂,但是基本功能是實現(xiàn)。
- 自定義關(guān)機時間;
- 在無輸入的情況下,默認(rèn)關(guān)機時間。(有時候需要偷偷離開一下,又怕實驗室老板發(fā)現(xiàn),就需要在實驗室下班前保持電腦開啟,下班時自動關(guān)機,這個功能是專門為我這種懶人定制的~~~~;-));
- 取消已有關(guān)機計劃;
- 計劃設(shè)定結(jié)果顯示;
實現(xiàn)流程就是獲取目標(biāo)時間和當(dāng)前時間,求差,判斷是否是當(dāng)天任務(wù),將時間差轉(zhuǎn)換成秒后調(diào)用 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
)
求得的參數(shù)在截取小時和分鐘時也有些不一樣的用法,使用了%和!來表示變量。 解釋: 如果使用行內(nèi)或括號內(nèi)定義或修改的變量,需要啟用延遲變量擴充,用嘆號引用變量。bat文件中用 setlocal enabledelayedexpansion 啟用延遲變量擴充,命令提示符窗口啟用延遲變量擴充
setlocal enabledelayedexpansion
set /a hourGoal =!timeGoal:~0,%num%!
set /a num+=1
set /a minuteGoal = !timeGoal:~%num%,2!
實現(xiàn)默認(rèn)輸入?yún)?shù)值:
set "timeGoal= 21:15"
set /p "timeGoal= 請輸入關(guān)機時間:"
運行結(jié)果圖
|