@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
set "SITE_TO_CHECK=y000a.ru"
set "LOG_FILE=C:\ping_monitor\log.txt"
:: Создаём папку, если её нет
if not exist "C:\ping_monitor" mkdir "C:\ping_monitor"
:: Проверяем, есть ли уже файл лога, если нет — создаём его
if not exist "%LOG_FILE%" echo [INFO] Log file created. > "%LOG_FILE%"
:: Переменные для отслеживания состояния
set /a DOWN_TIME=0
set /a UP_TIME=0
set /a bad_counter=0
echo Скрипт запущен. Проверка доступности %SITE_TO_CHECK%...
echo Для выхода нажмите Ctrl+C
echo.
:loop
:: Выполняем пинг и сохраняем результат во временную переменную
ping -n 1 %SITE_TO_CHECK% > C:\ping_monitor\temp_ping.txt
find "TTL=" C:\ping_monitor\temp_ping.txt >nul
if errorlevel 1 (
:: Сайт НЕ доступен
if !bad_counter! LSS 5 (
set /a bad_counter+=1
echo [!time!] Попытка %bad_counter%: сайт %SITE_TO_CHECK% недоступен
)
if !bad_counter! EQU 5 (
if !DOWN_TIME! EQU 0 (
call :GetUnixTime DOWN_TIME
if !DOWN_TIME! GTR 0 (
echo [!time!] САЙТ НЕДОСТУПЕН!
echo [%date% !time!] Сайт %SITE_TO_CHECK% недоступен >> "%LOG_FILE%"
) else (
echo [ОШИБКА] Не удалось получить Unix-время!
)
)
)
) else (
:: Сайт доступен
if !DOWN_TIME! GTR 0 (
call :GetUnixTime UP_TIME
if !UP_TIME! GTR 0 (
call :get_duration
echo [!time!] Сайт снова доступен.
echo [!time!] Интервал недоступности: !DURATION!
echo [%date% !time%] Сайт снова доступен. Интервал недоступности: !DURATION! >> "%LOG_FILE%"
set /a DOWN_TIME=0
set /a UP_TIME=0
) else (
echo [ОШИБКА] Не удалось получить текущее Unix-время!
)
)
set /a bad_counter=0
)
:: Удаляем временный файл
del temp_ping.txt 2>nul
timeout /t 1 /nobreak >nul
goto :loop
:get_duration
set /a DIFF_SEC = !UP_TIME! - !DOWN_TIME!
if !DIFF_SEC! LSS 0 set /a DIFF_SEC=0
call :seconds_to_hhmmss !DIFF_SEC!
set "DURATION=!RETURN_VALUE!"
goto :eof
:GetUnixTime
setlocal
:: Получаем Unix-время через PowerShell
for /f %%t in ('powershell -Command "(Get-Date).ToUniversalTime().ToFileTimeUtc() / 10000000 - 11644473600" 2^>nul') do (
set "unix_time=%%t"
)
:: Проверяем, что получили число
if defined unix_time (
endlocal & set "%1=%unix_time%"
) else (
endlocal & set "%1=0"
)
goto :eof
:seconds_to_hhmmss
set /a "hours=%~1 / 3600", "minutes=( %~1 %% 3600 ) / 60", "secs=( %~1 %% 60 )"
if %hours% LSS 10 set "hours=0%hours%"
if %minutes% LSS 10 set "minutes=0%minutes%"
if %secs% LSS 10 set "secs=0%secs%"
set "RETURN_VALUE=!hours!:!minutes!:!secs!"
goto :eof