Осталось до запланированного выключения?

Есть ли способ просмотреть, сколько времени осталось до запланированного выключения в Windows 7?

Запланированное выключение означает «выключение» (или перезапуск), запланированное с помощью приложения командной строки shutdown.exe, например:

shutdown /t 600 /s

Появится окно с сообщением, что есть 10 минут до выключения и фактическое системное время выключения.

В любое время дольше, чем 600 секунд вместо этого используется воздушное сообщение.

Я смутно помню XP, обеспечивающий монитор прогресса графического интерфейса, с обратным отсчетом.

Как они работали? Время останова или запланированное время должно быть где-то сохранено, как я могу получить к нему доступ?

Мое предпочтение - это какой-то метод через командную строку (т. е. не GUI). Что еще более важно, это достигается в Windows, то есть без каких-либо сторонних программ?

Если это невозможно для стандартных утилит Windows (и я гранича с территорией переполнения стека здесь), существует ли Windows API (или .NET, который может даже использоваться в PowerShell!)? Либо было бы предпочтительнее какой-либо случайной сторонней программы.

7 голосов | спросил Bob 19 PMpThu, 19 Apr 2012 15:11:55 +040011Thursday 2012, 15:11:55

1 ответ


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, разделенное Пробел or TAB .
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, если нет, то прекратите использование 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, чтобы получить истекшее /оставшееся время.

ответил Sampo Sarrala 15 Mayam12 2012, 02:02:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132