Waktu tersisa sebelum jadwal shutdown?

8

Apakah ada cara untuk melihat berapa banyak waktu yang tersisa sebelum penghentian yang dijadwalkan pada Windows 7?

Dengan shutdown terjadwal yang saya maksud adalah shutdown (atau restart) yang dijadwalkan menggunakan shutdown.exeaplikasi baris perintah , misalnya:

shutdown /t 600 /s

Itu akan memunculkan kotak pesan yang mengatakan ada 10 menit sampai shutdown, dan waktu sistem shutdown yang sebenarnya.

Setiap saat, lebih dari 600detik, gunakan pesan balon.

Samar-samar saya ingat XP menyediakan monitor kemajuan GUI, dengan hitungan mundur.

Bagaimana cara kerjanya? Waktu shutdown yang tersisa atau waktu yang dijadwalkan harus disimpan di suatu tempat, bagaimana saya bisa mengakses ini?

Preferensi saya adalah beberapa metode melalui baris perintah (yaitu non-GUI). Lebih penting lagi, apakah ini dapat dicapai dalam Windows, yaitu tanpa program pihak ketiga?

Jika ini tidak dapat dilakukan dengan utilitas Windows standar (dan saya berbatasan dengan wilayah Stack Overflow di sini), apakah ada fungsi Windows API (atau .NET, yang bahkan dapat digunakan dalam PowerShell!)? Entah akan lebih disukai daripada beberapa program pihak ketiga acak.

Bob
sumber
superuser.com/a/317062/117590 tampak menjanjikan, namun, lebih disukai / diharuskan bahwa perintah shutdown tidak dimodifikasi seperti menambahkan komentar ( /c <time>) tidak.
Bob
Saya pikir file batch tidak akan sulit untuk ditulis .. Prompt untuk waktu itu, dan setiap 5 menit atau lebih itu bisa merespons dengan waktu, yaitu "10 menit tersisa" .. dan ketika sampai ke 1, hitung mundur dengan detik atau sesuatu.
cutrightjm
Saya tidak perlu hitung mundur, saya perlu beberapa metode untuk mendapatkan sisa waktu pada saat ini. Perintah shutdown sedang dipanggil oleh program eksternal.
Bob

Jawaban:

5

Pertanyaan itu menarik jadi saya menulis batch yang dapat melakukan pekerjaan untuk Anda.

Pada dasarnya ini adalah penghitung waktu mundur, saya tidak memasukkan shutdownperintah untuk ini tetapi meninggalkannya sebagai pekerjaan rumah. Perhitungannya tidak akurat, ini tidak peduli tahun kabisat, panjang bulan, ... ini terutama untuk keterbacaan karena saya ingin tetap mudah dipelajari.

Saat ini ada dua file melakukan pekerjaan bersama, satu mulai timer dan lainnya, ketika dipanggil, memberi tahu berapa banyak waktu yang telah berlalu dari timer mulai. Kedua file ini dapat dengan mudah digabungkan menjadi satu skrip cmd, dengan cara ini Anda dapat membuat beberapa baris dapat digunakan kembali ( seperti metode yang didefinisikan ) juga.

Oke, mari kita lihat skrip,

Ini adalah 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

Sejalan dimulai dengan FOR /F "skip=1 ...:
1. Tanyakan wmicwaktu dan tanggal saat ini.
2. Lewati baris pertama output, yaitu heading, oleh skip=1
3. Baca nilai menggunakan tokens=1-6makna yang %%a-%%fdipisahkan oleh SpaceorTAB.
4. nilai Store untuk variabel %DateY%, ... %TimeH%, %TimeM%, ...

Setelah itu di awal, SET /A EPOCH=...kami menggunakan ekspresi yang menghitung detik berlalu1.1.1970 ( ini adalah perkiraan sederhana, bukan waktu unix nyata. Lihat Google jika Anda perlu akurat ).

Kemudian pada baris terakhir ECHO %EPOCH% > ...tulis waktu yang dihitung ke file bernama " Timer.start.state".

Dan di sini 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

Di sini aliran kode tidak linier dari atas ke bawah. Pertama kita GOTO CHECKFILEmemberi label sehingga perintah eksekusi benar-benar dimulai pada baris yang mengatakan :CHECKFILE. Banyak hal di sini sama seperti dengan StartTimer.cmdjadi saya hanya menjelaskan baris baru atau yang diubah.

Pertama kita periksa apakah file negara Timer.start.stateada, jika tidak maka hentikan pesan kecerdasan. Jika penghitung waktu dimulai dan file ada, maka kami melanjutkan dan melakukan penghitungan:
1. Lompat ke :TIMEOUTtempat kami mengeluarkan detik yang telah berlalu. Anda dapat memilih label yang lebih baik untuk itu ...
2. SET /P %Timer% ... membaca waktu mulai dari file dan menetapkan nilai ke %Timer%variabel.
3. SET /A Elapsed ... menghitung detik antara waktu mulai dan sekarang.
4. ECHO "Seconds ... menggemakan nilai yang dihitung (detik sejak penghitung waktu mulai

Cara mendapatkan sisa waktu:

Anda dapat mengurangi %Elapsed%dari %MaxTime%:

@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"

OKE, cukup dijelaskan. Berikut ini skrip lengkap Timer.cmd:

Pada titik ini, lupa semua yang sudah dikatakan. File batch ini di sini berfungsi sendiri sehingga tidak ada yang terpisah StartTimer.cmdatau GetTimerValue.cmdhanya ini Timer.cmd. Pada dasarnya masih sama tetapi aliran kode berbeda dan penggunaannya juga sama sekali berbeda. Namun ini tidak menyimpan status ke file sehingga Anda tidak bisa lagi mendapatkan nilai waktu setelah logoff / reboot, jika Anda memerlukan contoh penggunaan di atas untuk menyimpan / membaca status ke / dari file.

Penggunaan / bantuan Timer.cmddicetak saat dijalankan tanpa argumen. Saya belum sepenuhnya menguji ini dan mungkin ada beberapa kesalahan ketik dll, args tidak sangat mudah diperiksa.

@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

Integrasikan dengan shutdownatau perintah lain:

File poweroff.cmd:

@ECHO OFF
Timer start %1
shutdown -t %1 -s

Penggunaan: poweroff <wait_seconds>untuk memulai penghentian waktu dan Timer getuntuk mendapatkan sisa waktu.

Sampo Sarrala - codidact.org
sumber
Saya salut atas usaha Anda. Saya baru menyadari betapa buruknya ungkapan pertanyaan itu, tetapi Anda masih berhasil menjawabnya. Hanya untuk itu Anda mendapat upvote. Sayangnya, ini tidak bekerja dengan perintah shutdown yang sewenang-wenang, yaitu StartTimer.cmdharus secara eksplisit dipanggil. Saya telah menulis sebuah program kecil untuk menyelesaikan masalah saya, yang akan saya posting ketika saya kembali ke komputer saya.
Bob
Ok, saya akan menerima ini. Saya akhirnya menulis program C # yang bernama shutdown.exe, yang disebut shutdown_original.exe. Itu akan memeriksa /tbendera dan jika ada, buat file dengan waktu mulai dan akhir disimpan. Pada waktu pengambilan ( /retrievebendera), itu akan memeriksa log peristiwa untuk melihat apakah startup atau batal dilakukan sejak timer dimulai. Saya tidak yakin bagaimana ini akan menangani hibernasi. Saya tidak akan memposting kode atau program: ini adalah kekacauan kereta. Dan untuk membuat programnya bekerja, saya harus banyak dipusingkan dengan pengaturan keamanan, yang tidak ingin saya promosikan.
Bob
Konsep dasar mencegat shutdown.exepanggilan dan mencatat waktu ke file, yang adalah apa yang Anda lakukan dan mengapa saya menerima ini.
Bob
2
@ Bob - Anda akan memposting tentang program Anda ketika Anda kembali? Tautan ke exe / kode sumber?
Alex S