@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
set "SITE_TO_CHECK=%~1"
set "LOG_FILE=C:\ping_monitor\log_%SITE_TO_CHECK%.txt"
set "TEMP_PING_FILE=C:\ping_monitor\temp_ping_%SITE_TO_CHECK%.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% > %TEMP_PING_FILE%
find "TTL=" %TEMP_PING_FILE% >nul
if errorlevel 1 (
:: Сайт НЕ доступен
if !bad_counter! LSS 5 (
set /a bad_counter+=1
)
if !bad_counter! EQU 5 (
if !DOWN_TIME! EQU 0 (
call :GetUnixTime DOWN_TIME
:: echo [!DOWN_TIME!]
if !DOWN_TIME! GTR 0 (
echo [%date% !time!] САЙТ %SITE_TO_CHECK% НЕДОСТУПЕН!
echo [%date% !time!] Сайт %SITE_TO_CHECK% недоступен >> "%LOG_FILE%"
) else (
echo [ОШИБКА] Не удалось получить Unix-время!
)
)
)
) else (
:: Сайт доступен
if !DOWN_TIME! GTR 0 (
call :GetUnixTime UP_TIME
:: echo [!UP_TIME!]
if !UP_TIME! GTR 0 (
call :get_duration
echo [%date% !time!] Сайт %SITE_TO_CHECK% снова доступен. Интервал недоступности: !DURATION!
echo [%date% !time!] Сайт %SITE_TO_CHECK% снова доступен. Интервал недоступности: !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 "$ft = (Get-Date).ToUniversalTime().ToFileTimeUtc(); [math]::Floor($ft / 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