คำถามน่าสนใจดังนั้นฉันจึงเขียนแบทช์ที่สามารถทำงานให้คุณได้
โดยทั่วไปมันเป็นตัวจับเวลาถอยหลังฉันไม่ได้รวมshutdown
คำสั่งนี้ แต่ปล่อยให้มันเป็นการบ้าน การคำนวณไม่ถูกต้องนี่ไม่สนใจปีอธิกสุรทินเดือนนี้ ... ส่วนใหญ่จะอ่านง่ายเพราะฉันอยากให้มันง่ายต่อการเรียนรู้
ขณะนี้มีไฟล์สองไฟล์ที่ทำงานร่วมกันหนึ่งรายการเริ่มจับเวลาและอื่น ๆ เมื่อถูกเรียกจะบอกเวลาที่ผ่านไปตั้งแต่เริ่มจับเวลา ไฟล์สองไฟล์เหล่านี้สามารถรวมกันได้อย่างง่ายดายเป็นหนึ่ง cmd script วิธีนี้คุณสามารถทำให้บางบรรทัดนำมาใช้ใหม่ ( เช่นวิธีการที่กำหนด ) เกินไป
เอาล่ะมาดูสคริปต์กัน
นี่คือStartTimer.cmd
:
@ECHO OFF
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
SET DateD=%%a
SET TimeH=%%b
SET TimeM=%%c
SET DateM=%%d
SET TimeS=%%e
SET DateY=%%f
)
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
ECHO %EPOCH% > Timer.start.state
ในบรรทัดที่เริ่มต้นด้วยFOR /F "skip=1 ...
:
1.ขอwmic
เวลาและวันที่ปัจจุบัน
2.ข้ามบรรทัดแรกของการส่งออกซึ่งเป็นส่วนหัวด้วยskip=1
3.ค่าใช้อ่านtokens=1-6
ความหมายแยกจากกันโดย%%a-%%f
4.เก็บค่าตัวแปร, ... , ...Spaceor
TAB
%DateY%
%TimeH%
%TimeM%
หลังจากนั้นที่บรรทัดเริ่มต้นSET /A EPOCH=...
เราใช้นิพจน์ที่คำนวณวินาทีที่ผ่านไป1.1.1970
( นี่เป็นค่าประมาณอย่างง่ายไม่ใช่เวลายูนิกซ์จริงดู Google หากคุณต้องการความแม่นยำ )
จากนั้นที่บรรทัดสุดท้ายจะECHO %EPOCH% > ...
เขียนเวลาคำนวณไปยังไฟล์ที่เรียกว่า " Timer.start.state
"
และที่นี่GetTimerValue.cmd
:
@ECHO OFF
GOTO CHECKFILE
:TIMEOUT
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
SET DateD=%%a
SET TimeH=%%b
SET TimeM=%%c
SET DateM=%%d
SET TimeS=%%e
SET DateY=%%f
)
SET /P Timer=<"Timer.start.state"
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
SET /A Elapsed=%EPOCH%-%Timer%
ECHO "Seconds since timer started: %Elapsed%"
GOTO EOF
:CHECKFILE
IF EXIST "Timer.start.state" (
GOTO TIMEOUT
) ELSE (
ECHO "Timer not started. Start timer by running Timer.cmd"
)
:EOF
การไหลของโค้ดที่นี่ไม่ใช่เชิงเส้นจากบนลงล่าง ก่อนอื่นเราติดGOTO CHECKFILE
ป้ายกำกับเพื่อให้คำสั่งการดำเนินการเริ่มต้นที่บรรทัดที่ระบุ:CHECKFILE
ไว้ หลายสิ่งหลายอย่างที่นี่เหมือนกับStartTimer.cmd
ฉันเลยอธิบายเฉพาะบรรทัดใหม่หรือที่เปลี่ยนไป
ก่อนอื่นเราจะตรวจสอบว่าTimer.start.state
มีไฟล์สถานะอยู่หรือไม่ถ้าไม่แล้วก็เลิกใช้ข้อความ wit หากตัวจับเวลาเริ่มต้นและไฟล์มีอยู่แล้วเราจะดำเนินการต่อและทำคณิตศาสตร์:
1.ข้ามไปยัง:TIMEOUT
ตำแหน่งที่เราส่งออกวินาทีที่ผ่านไป คุณสามารถเลือกป้ายกำกับที่ดีกว่าสำหรับ ...
2. SET /P %Timer% ...
อ่านเวลาเริ่มต้นจากไฟล์และกำหนดค่าให้กับ%Timer%
ตัวแปร
3. SET /A Elapsed ...
คำนวณวินาทีระหว่างเวลาเริ่มต้นและตอนนี้
4. ECHO "Seconds ...
สะท้อนค่าที่คำนวณได้ (วินาทีนับตั้งแต่การเริ่มจับเวลา)
วิธีรับเวลาที่เหลืออยู่:
คุณสามารถย่อ%Elapsed%
จาก%MaxTime%
:
@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"
ตกลงอธิบายให้พอ นี่คือสคริปต์แบบเต็มTimer.cmd
:
ณ จุดนี้ลืมทุกอย่างที่พูดไปแล้ว ไฟล์ชุดนี้ที่นี่เป็นคนที่ทำงานเป็นของตัวเองดังนั้นจึงไม่มีแยกต่างหากStartTimer.cmd
หรือแต่เพียงแค่นี้GetTimerValue.cmd
Timer.cmd
โดยพื้นฐานแล้วยังคงเหมือนเดิม แต่การไหลของรหัสแตกต่างกันและการใช้งานก็แตกต่างกันโดยสิ้นเชิง อย่างไรก็ตามนี่ไม่ได้บันทึกสถานะเป็นไฟล์ดังนั้นคุณจึงไม่สามารถรับค่าตัวจับเวลาได้อีกต่อไปหลังจากออกจากระบบ / รีบูตหากคุณต้องการตัวอย่างการใช้งานด้านบนเพื่อบันทึก / อ่านสถานะไปยัง / จากไฟล์
การใช้งาน / ช่วยเหลือสำหรับTimer.cmd
พิมพ์เมื่อทำงานโดยไม่มีข้อโต้แย้ง ฉันยังไม่ได้ทดสอบอย่างเต็มที่และอาจมีความผิดพลาดบางอย่างเป็นต้นไม่ได้ตรวจสอบความผิดพลาด
@ECHO OFF
GOTO TimerUser%1
:: ===================================
:: Operation is start, (re)start timer
:: ===================================
:TimerUserstart
ECHO %2 | FINDSTR /R "^[1-9]"
IF %ERRORLEVEL%==0 (
SET Timer.max=%2
GOTO TimerStart
) ELSE (
ECHO.
ECHO !! ERROR !!
ECHO You must specify maximum value.
ECHO ===============================
GOTO TimerUser
)
:: =============================================
:: Operation is get, get values if timer running
:: =============================================
:TimerUserget
IF DEFINED Timer.start.state (
GOTO TIMEOUT
) ELSE (
ECHO.
ECHO !! ERROR !!
ECHO Timer is not started, start timer first.
ECHO ========================================
GOTO TimerUser
)
:: ============
:: Usage / Help
:: ============
:TimerUser
ECHO.
ECHO Timer.cmd Usage: Timer.cmd operation [options]
ECHO.
ECHO - Operations
ECHO start Start new timer, n must be specified.
ECHO get Get current value of started timer.
ECHO.
ECHO - Options:
ECHO n Max value in seconds, used to calculate remaining time.
ECHO.
GOTO EOF
:: =============================
:: Update %Timer.epoch% variable
:: =============================
:TimerUpdateEpoch
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
SET DateD=%%a
SET TimeH=%%b
SET TimeM=%%c
SET DateM=%%d
SET TimeS=%%e
SET DateY=%%f
)
SET /A Timer.epoch=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
GOTO %Timer.Callback%
:: ===========================================
:: Start new timer destoying/resetting old one
:: ===========================================
:TimerStart
SET Timer.Callback=TimerStartC1
GOTO TimerUpdateEpoch
:TimerStartC1
SET Timer.start.state=%Timer.epoch%
GOTO EOF
:: =============================
:: Echo out current timer values
:: =============================
:TIMEOUT
SET Timer.Callback=TimerEchoJ1
GOTO TimerUpdateEpoch
:TimerEchoJ1
SET /A Timer.elapsed=%Timer.epoch%-%Timer.start.state%
SET /A Timer.remaining=%Timer.max%-%Timer.elapsed%
ECHO "Seconds since timer started: %Timer.elapsed% Time remaining %Timer.remaining%"
GOTO EOF
:EOF
รวมกับshutdown
หรือคำสั่งอื่น ๆ :
ไฟล์poweroff.cmd
:
@ECHO OFF
Timer start %1
shutdown -t %1 -s
การใช้งาน: poweroff <wait_seconds>
เพื่อเริ่มต้นการปิดระบบตามกำหนดเวลาและTimer get
เพื่อรับเวลาที่เหลือ / ผ่าน
/c <time>
)