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