Началось всё с того, что я купил у китайцев часы-конструктор ... ну и захотелось всегда иметь точное время для проверки. Везде советуют спецпроги или правку реестра с целью уменьшения интервала синхронизации ... или планировщик ... а при нечаянной переустановке винды всё придётся делать заново. Всякие гуры пишут, что по-другому нельзя, но на то они и гуры
Сами мы ни разу не админы (ну может только 0,1 раза), но полазив по инету, можно найти какие-то отдельные куски из которых можно соорудить bat-файл. Сей батник можно сразу запихнуть в автозагрузку, но я для таких причиндалов, которые желательно сохранять отдельно от винды, завёл специальную папку. А в автозагрузку запихнул ярлык, в свойствах которого указал, что запускать надобно в свёрнутом виде, чтобы глаза не мозолило.
Автозагрузка в винХР находится тут:
C:\Documents and Settings\имя вашей учетной записи\Главное меню\Программы\Автозагрузка
в вин7 тут:
C:\Users\имя вашей учетной записи\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
в других винах ищите сами
Проблемы были в том, что батник и служба времени запускаются не скоординированно и что неудачная синхронизация никак не влияет на код ошибки errorlevel. Посему либо команда сихронизации может не сработать, либо внешний сервер отвалится, а мы этого не узнаем. Но мышей надо ловить, невзирая на проблемы.
Результат тут:
Спойлер
@ echo off
:: Создаём пустой лог-файл
copy nul путь\logfile.txt
:CHECK
:: Проверка состояния службы
echo Checking Time Synchronization Service ...
sc query w32time | 1>nul findstr /r /c:"STATE.*RUNNING"
if not errorlevel 1 (
:: Попытка синхронизации если служба запущена с выводом сообщения в лог-файл
echo Running ... Synchronizing ...
w32tm /resync > путь\logfile.txt
) else (
:: Ожидание 10 сек перед новой проверкой, если ещё не запущена
echo NOT Running ... Waiting ...
ping -n 10 localhost>nul
GOTO CHECK
)
:: Эталон сообщения об успешном завершении (в кавычках - потому что с пробелами / кодировка CP866)
set good="Љ®¬ ¤ ўлЇ®«Ґ гбЇҐи®."
:: Чтение и отображение первой строки сообщения из лог-файла
set /p message=< путь\logfile.txt
echo %message%
:: Чтение второй строки (more +1)из лог-файла и её запись в переменную (плюс кавычки)
for /f "tokens=*" %%i in ('more +1 "путь\logfile.txt"') do (
set result="%%i" & goto :OUT)
:OUT
:: Отображение второй строки, за вычетом кавычек (в конце ещё какой-то символ, но на сравнение не влияет)
echo %result:~1,-2%
:: Сравнение второй строки (с кавычками, иначе if не понимает пробелов) с эталоном и дописывание лог-файла
if %result%==%good% (
COLOR A0
echo OK & echo OK >> путь\logfile.txt
:: Останавливаем службу за дальнейшей ненадобностью (опционально) и дописываем лог-файл
net stop w32time >> путь\logfile.txt
) else (
COLOR C0
echo ERROR !!! & echo ERROR !!! >> путь\logfile.txt
:: оставляем окно открытым для выяснения причин ошибки
pause
)
exitРаботает
Читаем, забираем, пользуемся, комментируем, предлагаем варианты.