2010年1月29日 星期五

電腦-系統-自動開機

懶人專用:設「自動開機」的機器,「週末」「自動關機」。
有很多懶人為了在上班時間不想等待電腦開機,故使用了 bios 內的「自動開機」功能,但有一個問題是,週末週日不用上班,機器還是會在設定的時間自動開啟。因此小弟參考 tscmd 的指令寫了兩個批次檔,配合 xp 的工作排程來解決這個問題。

需要事先聲明的是,對公司而言,使用 bios 那陽春的「自動開機」功能並不是一個好的使用習慣,尤其是如果遇到連續假期,那除了手動拔插頭外,目前想不到任何好方法可以避免在非週六日的日子電腦空轉浪費電。

進入正題:

將 下面批次檔存成純文字檔,放在硬碟中,再到 控制台 -> 排定的工作 -> 新增排定的工作,先按「下一步」,再來會看到「應用程式」,請按「瀏灠」,選取硬碟中的「自動關機.cmd」,然後下一步,執行的方式選擇「在您的電腦啟 動時執行」,然後按下一步,會要您輸入開機登入的帳號密碼,輸入完後到下一個畫面,請勾選「按下完成後開啟進階內容」後再按「完成」,之後會進入另一個設 定畫面,點選上方的「設定」頁籤,把畫面上的「勾」全部拿掉,再按「確定」即可。至此完成第一階段設定。

自動關機.cmd
@echo off & setlocal enableextensions
if not exist c:\mytemp mkdir c:\mytemp
echo>c:\mytemp\tmp$$$.vbs WScript.Echo Weekday(Date,vbMonday)
for /f %%d in ('cscript //nologo c:\mytemp\tmp$$$.vbs') do set wd_=%%d
for %%f in (c:\mytemp\tmp$$$.vbs) do if exist %%f del %%f
rmdir c:\mytemp
rem 週1-週0=1-7, > 5 就啟動關機程序
if %wd_% LSS 6 (endlocal & exit /b)

call :ProcDelay 1000
rem 1000 約等於 10 秒,如覺不夠可以自己增加

endlocal & goto _shut_immediatly

:ProcDelay delayMSec_
setlocal enableextensions
set time_=%time%
set time_=%time_::0=:%
set time_=%time_:.0=.%
set time_=%time_: =%
for /f "tokens=1-4 delims=:. " %%h in ('echo %time_%') do (
set /a start_=360000*%%h+6000*%%i+100*%%j+%%k)
:_procwaitloop
set time_=%time%
set time_=%time_::0=:%
set time_=%time_:.0=.%
set time_=%time_: =%
for /f "tokens=1-4 delims=:. " %%h in ('echo %time_%') do (
set /a now_=360000*%%h+6000*%%i+100*%%j+%%k)
set /a diff_=%now_%-%start_%+3
if %diff_% LSS %1 goto _procwaitloop
endlocal

:_shut_immediatly
shutdown -s -t 60 -c "週末專用「自動關機」程序已啟用。如您已經登入,則不用管此畫面,關機程序會自動取消。如果尚未登入,則請在關機後再自行重開機,在本畫面出現前有約 10 秒讓您登入。"


此後只要遇到週六日機器就會在自動啟動後,依此批次檔指示自動進入關機程序,但凡事總有例外,尤其今年彈性調假特多,難免有週六日需要上班的狀況出現,故您會需要下面的配套批次檔。

將 下面批次檔存成純文字檔,放在硬碟中,再到 控制台 -> 排定的工作 -> 新增排定的工作,先按「下一步」,再來會看到「應用程式」,請按「瀏灠」,選取硬碟中的「取消關機.cmd」,然後下一步,執行的方式選擇「在您登入時執 行」,然後按下一步,會要您輸入開機登入的帳號密碼,輸入完後到下一個畫面,請勾選「按下完成後開啟進階內容」後再按「完成」,之後會進入另一個設定畫 面,點選上方的「設定」頁籤,把畫面上的「勾」全部拿掉,再按「確定」即可。至此完成第二階段設定。

取消關機.cmd
@echo off & setlocal enableextensions
if not exist c:\mytemp mkdir c:\mytemp
echo>c:\mytemp\tmp$$$.vbs WScript.Echo Weekday(Date,vbMonday)
for /f %%d in ('cscript //nologo c:\mytemp\tmp$$$.vbs') do set wd_=%%d
for %%f in (c:\mytemp\tmp$$$.vbs) do if exist %%f del %%f
rmdir c:\mytemp
rem 週1-週0=1-7, > 5 就啟動
if %wd_% LSS 6 (endlocal & exit /b)

call :ProcDelay 1000
rem 1000 約等於 10 秒,如覺不夠可以自己增加
endlocal & goto _shut_immediatly

:ProcDelay delayMSec_
setlocal enableextensions
set time_=%time%
set time_=%time_::0=:%
set time_=%time_:.0=.%
set time_=%time_: =%
for /f "tokens=1-4 delims=:. " %%h in ('echo %time_%') do (
set /a start_=360000*%%h+6000*%%i+100*%%j+%%k)
:_procwaitloop
set time_=%time%
set time_=%time_::0=:%
set time_=%time_:.0=.%
set time_=%time_: =%
for /f "tokens=1-4 delims=:. " %%h in ('echo %time_%') do (
set /a now_=360000*%%h+6000*%%i+100*%%j+%%k)
set /a diff_=%now_%-%start_%+3
if %diff_% LSS %1 goto _procwaitloop
endlocal
:_shut_immediatly
shutdown -a


以後如果週六日沒上班的日子,時間到了電腦一樣會開機,但會被批次檔執行關機程序。如果週六日要上班也不用怕,在「關機畫面」出現前登入系統,關機程序會自動取消。


----------------

沒有留言:

張貼留言