Час залишилося до запланованого відключення?


8

Чи є спосіб переглянути скільки часу залишилося до запланованого відключення в Windows 7?

Під плановим відключенням я маю на увазі зупинку (або перезапуск), заплановану за допомогою програми командного рядка shutdown.exe, наприклад:

shutdown /t 600 /s

Це з'явиться вікно з повідомленням, що до завершення роботи залишилося 10 хвилин, і фактичний системний час відключення.

Будь-який час, що перевищує 600секунди, замість цього використовується повідомлення на повітряній кулі.

Я смутно пригадую XP, що забезпечує моніторинг ходу графічного інтерфейсу з відліком часу.

Як вони працювали? Час відключення залишеного або запланованого часу повинен зберігатися десь, як я можу отримати доступ до цього?

Мої переваги - якийсь метод через командний рядок (тобто не-GUI). Що ще важливіше, чи можна це здійснити в Windows, тобто без сторонніх програм?

Якщо це неможливо виконати зі стандартними утилітами Windows (і я межу з територією Stack Overflow), чи існує API API (або .NET, який навіть можна використовувати в PowerShell!)? Будь-який варіант буде кращим над якоюсь випадковою програмою сторонніх розробників.


superuser.com/a/317062/117590 виглядав багатообіцяючим, проте бажано / потрібно, щоб команда вимкнення не була змінена, оскільки це додає коментар ( /c <time>).
Боб

Я думаю, що пакетний файл не буде важко записати. Підказуйте час, і кожні 5 хвилин або близько того він може відповідати часом, тобто "10 хвилин залишилося" .. і коли він потрапить до 1, відлічуйте секунд чи щось.
cutrightjm

Мені не потрібен зворотний відлік, мені потрібен якийсь метод, щоб отримати час, що залишився на <цей> момент. Команда вимкнення викликає зовнішня програма.
Боб

Відповіді:


5

Питання було цікавим, тому я написав партію, яка може зробити для вас роботу.

В основному це таймер зворотного відліку, я не включав shutdown до цього команду, але залишив це як домашнє завдання. Розрахунки не точні, це не стосується високосних років, тривалості місяця, ... це головним чином для читабельності, оскільки я хотів, щоб це було легко вивчити.

В даний час два файли виконують роботу разом, один запускає таймер, а інший, коли викликається, повідомляє, скільки часу минуло від запуску таймера. Ці два файли досить легко поєднуватись в один cmd-скрипт, таким чином ви також можете зробити рядки для багаторазового використання ( наприклад, визначені методи ).

Гаразд, давайте подивимося на сценарії,

Ось 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розділені на SpaceorTAB.
4. Збережіть значення змінних %DateY%, ... %TimeH%,%TimeM% ...

Після цього на початку рядка SET /A EPOCH=...ми використовуємо вираз, який обчислює минулі секунди1.1.1970 ( це простий приблизний, а не реальний час Unix. Дивіться 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існує файл стану , якщо ні, то закінчуємо повідомлення з дотепністю. Якщо таймер запустився і файли існують, то ми продовжуємо і робимо певну математику:
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пройти / залишився час.


Я аплодую вам за зусилля. Я щойно зрозумів, наскільки сильно сформульовано питання, але ти все-таки зумів відповісти на нього. Тільки за це ви отримуєте нагороду. На жаль, це не працює з довільними командами відключення, тобто StartTimer.cmdмає бути явно викликано. Я написав невеличку програму, щоб вирішити свою проблему, яку я опублікую, коли повернусь до свого комп’ютера.
Боб

Гаразд, я прийму це. Я закінчив писати програму C #, яку назвали shutdown.exe, яка назвала shutdown_original.exe. Він перевірить наявність /tпрапора, і якщо він існує, створити файл із збереженими часом запуску та кінця. Під час завантаження ( /retrieveпрапор) він перевірятиме журнал подій, щоб побачити, чи було запущено або перервано роботу з моменту запуску таймера. Я не впевнений, як би впоралися зі сплячками. Я не збираюся розміщувати код або програму: це баггічний безлад. А для того, щоб програма працювала, мені довелося багато возитися з налаштуваннями безпеки, які я не хочу рекламувати.
Боб

Основна концепція - перехоплення shutdown.exeвиклику та реєстрація часу до файлу, що саме ви робили, і чому я це приймаю.
Боб

2
@Bob - Ви збиралися публікувати інформацію про свою програму, коли повернулися? Посилання на EXE / вихідний код?
Alex S
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.