Спать хочется

Mar 11, 2008 03:19


Поскольку количество случаев, когда я засыпал крепким сном, забыв выключить компьютер, не поддается исчислению - решил-таки сделать автоматическое отключение при отсутствии в ночное время активности пользователя. То есть, если, скажем, к часу ночи пользователь дрыхнет уже пару часов - то выключаемся, а если к двум часам пользователь видит сны хотя бы час - тоже выключаемся. Ну а в три часа ночи достаточно получасовой паузы :-)

Делается это, если кто не в курсе, путем добавления задания "rundll32.exe powrprof.dll,SetSuspendState" и установкой на последней закладке галочки «Запускать задание, когда компьютер простаивает» с желаемым интервалом времени. Чтобы всё работало - на первой закладке надо поставить также галку «Выполнять только при выполненном входе в систему».

Кстати, да - вышеуказанная команда на самом деле не выключает компьютер, а переводит его в «Спящий режим», когда содержимое оперативки сбрасывается на диск, и при последующем включении состояние системы восстанавливается. Это хорошо и удобно, но есть одна проблема: Миранда в этом случае не отлогинивается, а остается висеть какбэ «в сети», что нехорошо.

Путем недолгих поисков был обнаружен плагин для управления Мирандой из командной строки, так что поменяв вызов команды суспенда на вызов .bat-файла, который сначала отправляет Миранду в оффлайн, а затем - систему в суспенд проблема была вроде бы решена.

Но это на первый взгляд. На самом деле эти две команды должны разделяться небольшой паузой, иначе Миранда может не успеть. Это и оказалось самым проблематичным этапом, ибо в стандартных средствах винды (в отличие кстати от ДОС-а) нет утилиты, приостанавливающей выполнение командного файла не «до нажатия кнопки», а на заданное количество секунд :-( Путем недолгого гуглежа была найдена вот эта страничка, где предлагается хитровыдуманный способ сделать паузу в командном файле:
@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
echo %time:~6,-3% installing please wait...
echo.
echo Через 3 секунды продолжиться
set /a paused=%time:~7,-3%+3
if %paused% GEQ 10 set /a paused=!paused!-10
:check
set /a ttt=%time:~7,-3%
if not %paused%==%ttt% goto :check

Вопрос на засыпку: где здесь задается время? ;-) Я-то нашел, но с паузами больше нескольких секунд (в каментах говорят, что больше пяти, но у меня работало вроде до девяти) оно глючит. Там есть усовершенствованный вариант, раза в два длиньше, так что я подумал, что нуевонафик, ибо существует решение «в одну строку»: ping localhost -n 10 :-)

Итак, теперь, когда я уже сплю, подуставший за день компьютер будет запускать вот такой файлик:
mimcmd.exe status offline
ping localhost -n 10 > nul
rundll32.exe powrprof.dll,SetSuspendState

...и баиньки :-)

ЗЫ: Рассказ А.П.Чехова «Спать хочется».

хозяйке на заметку, софт, Меранда рулед

Previous post Next post
Up