Есть ли способ узнать, сколько времени осталось до запланированного завершения работы в Windows 7?
Под запланированным отключением я подразумеваю завершение работы (или перезапуск), запланированное с помощью shutdown.exe
приложения командной строки , например:
shutdown /t 600 /s
Появится окно с сообщением о том, что до выключения осталось 10 минут, а также фактическое время выключения системы.
В любое время, большее 600
секунды, вместо этого используется всплывающее сообщение.
Я смутно припоминаю, что XP предоставляет монитор прогресса с графическим интерфейсом и обратным отсчетом.
Как они работали? Оставшееся время отключения или запланированное время должно быть где-то сохранено, как я могу получить к нему доступ?
Я предпочитаю какой-то метод через командную строку (т.е. не-GUI). Что еще более важно, это выполнимо в Windows, то есть без каких-либо сторонних программ?
Если это невозможно осуществить с помощью стандартных утилит Windows (и я граничу с территорией переполнения стека), существует ли функция Windows API (или .NET, которую можно даже использовать в PowerShell!)? Любой из них будет предпочтительнее какой-либо случайной сторонней программы.
/c <time>
делает добавление комментария ( ).Ответы:
Вопрос был интересным, поэтому я написал пакет, который может сделать работу за вас.
В основном это таймер обратного отсчета, я не включил
shutdown
команду в это, но оставил это как домашнее задание. Расчеты не точные, это не заботится о високосных годах, длине месяца, ... это главным образом для удобства чтения, так как я хотел, чтобы его было легко выучить.В настоящее время два файла работают вместе: один запускает таймер, а другой, при вызове, сообщает, сколько времени прошло с момента запуска таймера. Эти два файла можно довольно легко объединить в один сценарий cmd, таким образом, вы можете сделать некоторые строки многократно используемыми ( например, определенные методы ).
Хорошо, давайте посмотрим на сценарии,
Вот
StartTimer.cmd
:В строке, начинающейся с
FOR /F "skip=1 ...
:1. Запросите
wmic
текущее время и дату.2. Пропустите первую строку вывода, которая является заголовками, на
skip=1
3. Считайте значения, используя
tokens=1-6
значения,%%a-%%f
разделенные Spaceor
TAB.4. Значение будет хранить в переменных
%DateY%
, ...%TimeH%
,%TimeM%
...После этого в начале строки
SET /A EPOCH=...
мы используем выражение, которое вычисляет истекшие секунды1.1.1970
( это просто приблизительное, а не реальное время Unix. Посмотрите Google, если вам нужно точно ).Затем в последней строке
ECHO %EPOCH% > ...
записывается рассчитанное время в файл с именем "Timer.start.state
".И здесь
GetTimerValue.cmd
:Здесь поток кода не является линейным сверху вниз. Сначала мы
GOTO CHECKFILE
помечаем так, чтобы команды выполнения действительно начинались со строки с надписью:CHECKFILE
. Многие вещи здесь такие же, как и с,StartTimer.cmd
поэтому я объясняю только новые или измененные строки.Сначала мы проверяем, существует ли файл состояния
Timer.start.state
, если нет, затем завершаем работу с сообщением. Если таймер запущен и файлы существуют, мы продолжаем и делаем некоторую математику:1. Переходим туда,
:TIMEOUT
где мы выводим истекшие секунды. Вы можете выбрать лучшую метку для этого ...2.
SET /P %Timer% ...
читает время запуска из файла и присваивает значение%Timer%
переменной.3.
SET /A Elapsed ...
рассчитывает секунды между временем запуска и сейчас.4.
ECHO "Seconds ...
выводит рассчитанное значение (в секундах с момента запуска таймера).Как получить оставшееся время:
Вы можете вычесть
%Elapsed%
из%MaxTime%
:Хорошо, объяснил достаточно. Вот полный сценарий
Timer.cmd
:На данный момент забыл, все уже сказано. Этот пакетный файл здесь работает сам по себе, поэтому нет отдельного
StartTimer.cmd
илиGetTimerValue.cmd
только этогоTimer.cmd
. В основном это все то же самое, но поток кода отличается, и использование также совершенно другое. Это, однако, не сохраняет состояние в файл, поэтому вы больше не можете получить значение таймера после выхода из системы / перезагрузки, если вам нужен приведенный выше пример использования для сохранения / чтения состояния в / из файла.Использование / справка
Timer.cmd
выводится при запуске без аргументов. Я не полностью проверил это, и могут быть некоторые опечатки и т. Д., Аргументы не проверены на защиту от ошибок.Интегрировать с
shutdown
или любой другой командой:Файл
poweroff.cmd
:Использование:
poweroff <wait_seconds>
для запуска по времени иTimer get
для определения истекшего / оставшегося времени.источник
StartTimer.cmd
должно вызываться явно. Я написал небольшую программу для решения своей проблемы, которую я опубликую, когда вернусь к своему компьютеру.shutdown.exe
названиеshutdown_original.exe
. Он проверит наличие/t
флага и, если он существует, создаст файл с сохраненным временем начала и окончания. При извлечении времени (/retrieve
флаг) он будет проверять журнал событий, чтобы увидеть, был ли выполнен запуск или отмена с момента запуска таймера. Я не уверен, как бы он справился с зимней спячкой. Я не собираюсь публиковать код или программу: это гадкий беспорядок. И чтобы заставить программу работать, мне пришлось много возиться с настройками безопасности, которые я не хочу рекламировать.shutdown.exe
вызов и записать время в файл, что вы и сделали, и почему я это принимаю.