คำถามน่าสนใจดังนั้นฉันจึงเขียนแบทช์ที่สามารถทำงานให้คุณได้
โดยทั่วไปมันเป็นตัวจับเวลาถอยหลังฉันไม่ได้รวม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.เก็บค่าตัวแปร, ... , ...SpaceorTAB
%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>)