UPD от 27.05.2026: в конце статьи добавил вариант скрипта, в котором проверяется несколько IP‑адресов и связь считается рабочей, если отвечает хотя бы один.
Надёжность сетевого подключения — один из ключевых факторов стабильной работы рабочих станций, серверов и специализированных терминалов. В ситуациях, когда связь может периодически пропадать, а ручное вмешательство нежелательно или невозможно, на помощь приходит автоматизация. Один из простых и эффективных способов обеспечить постоянный контроль доступности сети — использование BAT‑скрипта, работающего в фоне и выполняющего регулярные проверки. Рассмотрим, как устроен такой скрипт и почему он может стать полноценным инструментом сетевого мониторинга.
1. Назначение и общая логика работы
Основная задача скрипта — регулярно проверять доступность заданного IP‑адреса и автоматически восстанавливать соединение при обнаружении сбоя. В качестве тестового узла используется сервер 8.8.8.8 — один из самых стабильных публичных DNS‑серверов. Каждые пять минут выполняется команда ping, и результат проверки записывается в лог. Если ответ получен, фиксируется успешная проверка. Если же пинг не проходит, скрипт инициирует перезапуск сетевого адаптера, что часто помогает восстановить связь без участия пользователя.
2. Автоматическое восстановление сетевого подключения
При отсутствии ответа от тестового узла запускается процедура восстановления. Скрипт временно отключает сетевой адаптер, делает небольшую паузу и снова включает его. Такой подход позволяет устранить распространённые проблемы: зависание драйвера, потерю маршрута, сбой DHCP или временную потерю линка. После перезапуска адаптера в лог записывается информация о выполненной операции, что облегчает последующий анализ.
3. Система логирования и разделение событий
Скрипт ведёт два отдельных лога:
- основной лог — для штатных сообщений и успешных проверок;
- лог ошибок — для событий, связанных с потерей связи и перезапуском адаптера.
Каждый день создаётся новая папка с логами, что обеспечивает удобную структуру хранения и позволяет быстро находить нужные записи. Такой подход особенно полезен при длительном мониторинге или анализе нестабильных участков сети.
4. Ограничение размера логов и ротация
Чтобы предотвратить бесконтрольный рост логов, реализована система ограничения размера. Когда файл достигает установленного порога (1 МБ), запускается механизм ротации. Он последовательно сдвигает существующие файлы:
log.4 → log.5 log.3 → log.4 log.2 → log.3 log.1 → log.2 log → log.1
После этого создаётся новый пустой лог. Такой механизм позволяет хранить историю событий, не перегружая диск и не создавая гигантские файлы, неудобные для анализа.
5. Непрерывная работа в фоне
Скрипт работает в бесконечном цикле и не требует вмешательства пользователя. Его можно запускать вручную, через автозагрузку или через Планировщик задач — последний вариант наиболее надёжен, так как позволяет запускать мониторинг при старте системы и скрывать окно выполнения. Благодаря этому скрипт подходит для серверов, терминалов, кассовых систем и других устройств, где стабильность сети критически важна.
6. Преимущества подхода
Использование BAT‑скрипта даёт несколько важных преимуществ:
- не требует установки дополнительного ПО;
- работает на любой версии Windows;
- легко модифицируется под конкретные задачи;
- обеспечивает автономный мониторинг и самовосстановление;
- создаёт удобную структуру логов с ротацией.
Несмотря на простоту, такой скрипт способен выполнять функции полноценного сетевого watchdog‑механизма, обеспечивая стабильность подключения и минимизируя необходимость ручного вмешательства.
Код:
@echo off
setlocal enabledelayedexpansion
set TARGET=8.8.8.8
set ADAPTER="Ethernet"
set MAXSIZE=1048576
:: Папка логов YYYY-MM-DD
set LOGDIR=%~dp0logs\%date:~6,4%-%date:~3,2%-%date:~0,2%
if not exist "%LOGDIR%" mkdir "%LOGDIR%"
set LOG=%LOGDIR%\netwatch.log
set ERRLOG=%LOGDIR%\errors.log
:loop
echo [%date% %time%] Проверка связи с %TARGET% >> "%LOG%"
ping -n 1 %TARGET% >nul
if errorlevel 1 (
echo [%date% %time%] Нет ответа! Перезапуск адаптера %ADAPTER% >> "%LOG%"
echo [%date% %time%] Ошибка: нет ответа от %TARGET% >> "%ERRLOG%"
netsh interface set interface %ADAPTER% admin=disable
timeout /t 5 >nul
netsh interface set interface %ADAPTER% admin=enable
echo [%date% %time%] Адаптер перезапущен >> "%LOG%"
echo [%date% %time%] Перезапуск адаптера выполнен >> "%ERRLOG%"
) else (
echo [%date% %time%] Связь есть >> "%LOG%"
)
call :CheckSize "%LOG%"
call :CheckSize "%ERRLOG%"
timeout /t 300 >nul
goto loop
:: --- Проверка размера ---
:CheckSize
set "FILE=%~1"
if not exist "%FILE%" exit /b
for %%A in ("%FILE%") do set SIZE=%%~zA
if !SIZE! GTR %MAXSIZE% (
call :RotateLogs "%FILE%"
)
exit /b
:: --- Ротация логов ---
:RotateLogs
set "FILE=%~1"
set "DIR=%~dp1"
set "NAME=%~nx1"
:: Сдвигаем log.4 → log.5, log.3 → log.4, log.2 → log.3, log.1 → log.2
for /l %%i in (5,-1,2) do (
set /a j=%%i-1
if exist "%DIR%%NAME%.%%i" del "%DIR%%NAME%.%%i"
if exist "%DIR%%NAME%.!j!" ren "%DIR%%NAME%.!j!" "%NAME%.%%i"
)
:: Теперь основной лог → log.1
if exist "%FILE%" ren "%FILE%" "%NAME%.1"
exit /b
Вариант скрипта, в котором проверяется несколько IP‑адресов и связь считается рабочей, если отвечает хотя бы один.
Каждые 5 минут скрипт проверяет все IP‑адреса, логирует результат, при полном отсутствии связи перезапускает сетевой адаптер, следит за размером логов, делает ротацию и создаёт новую папку логов каждый день.
@echo off
setlocal enabledelayedexpansion
:: Имя адаптера — БЕЗ кавычек, безопасное присваивание
set "ADAPTER=Ethernet"
:: IP-адреса для проверки
set "TARGETS=8.8.8.8 192.168.0.3"
:: Максимальный размер логов (1 МБ)
set "MAXSIZE=1048576"
:loop
:: Получаем дату в формате YYYY-MM-DD (независимо от региона)
for /f %%a in ('powershell -NoLogo -NoProfile -Command "(Get-Date).ToString(\"yyyy-MM-dd\")"') do set "TODAY=%%a"
:: Папка логов на текущие сутки
set "LOGDIR=%~dp0logs\%TODAY%"
if not exist "%LOGDIR%" mkdir "%LOGDIR%"
set "LOG=%LOGDIR%\netwatch.log"
set "ERRLOG=%LOGDIR%\errors.log"
set "LINK_OK=0"
:: Проверка связи по всем IP
for %%T in (%TARGETS%) do (
echo [%date% %time%] Проверка связи с %%T >> "%LOG%"
ping -n 1 %%T >nul && (
echo [%date% %time%] Связь есть через %%T >> "%LOG%"
set "LINK_OK=1"
) || (
echo [%date% %time%] Нет ответа от %%T >> "%ERRLOG%"
)
)
:: Если ни один IP не ответил — перезапуск адаптера
if !LINK_OK! EQU 0 (
echo [%date% %time%] Все адреса недоступны! Перезапуск адаптера %ADAPTER% >> "%LOG%"
echo [%date% %time%] Ошибка: все адреса недоступны >> "%ERRLOG%"
netsh interface set interface %ADAPTER% admin=disable
timeout /t 5 >nul
netsh interface set interface %ADAPTER% admin=enable
echo [%date% %time%] Адаптер перезапущен >> "%LOG%"
echo [%date% %time%] Перезапуск адаптера выполнен >> "%ERRLOG%"
)
:: Проверка размера логов
call :CheckSize "%LOG%"
call :CheckSize "%ERRLOG%"
timeout /t 300 >nul
goto loop
:: --- Проверка размера ---
:CheckSize
set "FILE=%~1"
if not exist "%FILE%" exit /b
for %%A in ("%FILE%") do set "SIZE=%%~zA"
if !SIZE! GTR %MAXSIZE% (
call :RotateLogs "%FILE%"
)
exit /b
:: --- Ротация логов ---
:RotateLogs
set "FILE=%~1"
set "DIR=%~dp1"
set "NAME=%~nx1"
for /l %%i in (5,-1,2) do (
set /a j=%%i-1
call :DoRotate "%DIR%" "%NAME%" %%i !j!
)
if exist "%FILE%" ren "%FILE%" "%NAME%.1"
exit /b
:: --- Безопасная ротация ---
:DoRotate
set "DIR=%~1"
set "NAME=%~2"
set "I=%3"
set "J=%4"
if exist "%DIR%%NAME%.%I%" del "%DIR%%NAME%.%I%"
if exist "%DIR%%NAME%.%J%" ren "%DIR%%NAME%.%J%" "%NAME%.%I%"
exit /b

