kda7889.ru / Инструменты
Бесплатные инструменты
Диагностика сети для Windows
Когда «не работает интернет», скрипт за пару минут проверяет роутер (все сетевые подключения), связь с интернетом и DNS, а в конце пишет понятный итог: где именно сломалось. Всё видно прямо в окне, а полный отчёт сохраняется в файл — его можно отправить специалисту.
- Скачайте netdiag.bat (9 КБ).
- Запустите двойным щелчком. Права администратора не нужны.
- Через 1–2 минуты в окне появится итог, а отчёт
netdiag_ИМЯ-КОМПЬЮТЕРА.txtсохранится рядом со скриптом и откроется в Блокноте.
Проверен в Windows 10 и 11, рассчитан и на XP, Vista, 7 и 8: использует только встроенные команды Windows. Сообщения — по-русски, транслитом и по-английски, так что текст читается даже там, где кириллица не отображается. В Windows XP отчёт сохраняется, но не открывается в Блокноте сам — всё нужное видно в окне.
Скрипт ничего не меняет в системе и никуда не отправляет данные: только выполняет ipconfig, ping, nslookup, tracert и route print.
Браузер или Windows могут переспросить, точно ли запускать файл .bat, — так они делают с любым скриптом из интернета. Ниже — полный текст скрипта, его можно прочитать до запуска.
Что внутри скрипта
@echo off
rem Диагностика сети для Windows от XP до 11. Исходник src/netdiag.bat.txt в UTF-8; build.py
rem собирает из него tools/netdiag.bat в кодировке 866 и с переводами строк CRLF.
rem cmd читает .bat в OEM-кодировке, на LF и 1251 разбор строк ломается.
rem Правила: никаких блоков в скобках и спецсимволов cmd в тексте echo,
rem никаких тире и кавычек-ёлочек: их нет в 866, сборка упадёт.
setlocal
rem Кодовую страницу окна запоминаем и возвращаем в конце.
set "OCP="
for /f "tokens=2 delims=:" %%c in ('chcp') do set "OCP=%%c"
if defined OCP set "OCP=%OCP: =%"
if defined OCP set "OCP=%OCP:.=%"
chcp 866 >nul
title Diagnostika seti / Network diagnostics - kda7889.ru
set "LOG=%~dp0netdiag_%COMPUTERNAME%.txt"
rem Рядом со скриптом писать бывает нельзя: тогда отчёт кладём во временную папку.
rem Через две вертикальные черты, а не errorlevel: в XP ошибка записи его не ставит.
(type nul >"%LOG%") 2>nul || set "LOG=%TEMP%\netdiag_%COMPUTERNAME%.txt"
(type nul >"%LOG%") 2>nul
set "TMPF=%LOG%.tmp"
rem Системные команды по полному пути: в PATH бывают одноимённые из Git, Cygwin и MSYS
rem (find, ping), с другим синтаксисом, и все проверки молча показали бы НЕТ.
set "SYS=%SystemRoot%\system32"
set "FS=%SYS%\findstr.exe"
call :say "ДИАГНОСТИКА СЕТИ / DIAGNOSTIKA SETI / NETWORK DIAGNOSTICS - kda7889.ru/tools"
call :say "Компьютер / Kompyuter / Computer: %COMPUTERNAME% %DATE% %TIME%"
call :say ""
call :say "RU: Скрипт только читает настройки и ничего не меняет. Займёт 1-2 минуты, окно не закрывайте."
call :say "TR: Skript tolko chitaet nastroyki i nichego ne menyaet. Zaymyot 1-2 minuty, okno ne zakryvayte."
call :say "EN: The script only reads settings and changes nothing. It takes 1-2 minutes, keep this window open."
call :run "Версия Windows / Versiya Windows / Windows version" "ver"
call :run "Сетевые настройки / Setevye nastroyki / Network settings" "%SYS%\ipconfig.exe /all"
rem Основных шлюзов может быть несколько: Ethernet и Wi-Fi, VPN, виртуальные адаптеры.
rem Проверяем каждый IPv4-шлюз из таблицы маршрутов; On-link и прочее пропускаем.
rem Роутер считаем живым, если ответил хоть один.
set "GWS=;"
set "R_GW=NOTFOUND"
for /f "tokens=3" %%g in ('%SYS%\route.exe print 0.0.0.0 ^| "%FS%" /r /c:"^ *0\.0\.0\.0 "') do call :gw %%g
set "R_IP=FAIL"
call :run "Интернет по IP / Internet po IP / Internet by IP: 77.88.8.8" "%SYS%\ping.exe -n 4 -w 1000 77.88.8.8"
"%FS%" /l /c:"TTL=" "%TMPF%" >nul && set "R_IP=OK"
call :run "Интернет по IP / Internet po IP / Internet by IP: 8.8.8.8" "%SYS%\ping.exe -n 4 -w 1000 8.8.8.8"
"%FS%" /l /c:"TTL=" "%TMPF%" >nul && set "R_IP=OK"
rem DNS в порядке, если нашлось хоть одно из двух имён: один сайт может быть закрыт фильтром.
set "R_DNS=FAIL"
call :run "DNS: ya.ru" "%SYS%\nslookup.exe ya.ru"
call :run "DNS: google.com" "%SYS%\nslookup.exe google.com"
call :run "Сайт по имени / Sayt po imeni / Site by name: ya.ru" "%SYS%\ping.exe -n 2 -w 1000 ya.ru"
"%FS%" /l /c:"[" "%TMPF%" >nul && set "R_DNS=OK"
call :run "Сайт по имени / Sayt po imeni / Site by name: google.com" "%SYS%\ping.exe -n 2 -w 1000 google.com"
"%FS%" /l /c:"[" "%TMPF%" >nul && set "R_DNS=OK"
rem Ping наружу часто закрыт (офисы, часть провайдеров), а сайты при этом открываются.
rem Поэтому ещё и веб-страница через системный прокси - где есть PowerShell, Windows 7+.
rem Код возврата: 0 - открылась, 1-2 - нет или подменена (страница входа Wi-Fi), 9009 - нет PowerShell.
set "R_WEB=FAIL"
call :say ""
call :say "=== Веб-страница / Veb-stranitsa / Web page: www.msftconnecttest.com ==="
powershell -NoProfile -Command "try{$r=[Net.WebRequest]::Create('http://www.msftconnecttest.com/connecttest.txt'); $r.Timeout=10000; if($r.Proxy){$r.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials}; $s=(New-Object IO.StreamReader($r.GetResponse().GetResponseStream())).ReadToEnd(); if($s -like 'Microsoft Connect Test*'){exit 0}; exit 2}catch{exit 1}" >nul 2>nul
if not errorlevel 1 set "R_WEB=OK"
if errorlevel 9009 set "R_WEB=SKIP"
set "NET=FAIL"
if "%R_IP%"=="OK" set "NET=OK"
if "%R_WEB%"=="OK" set "NET=OK"
call :say ""
call :say "RU: Проверяю маршрут до интернета, подождите до минуты..."
call :say "TR: Proveryayu marshrut do interneta, podozhdite do minuty..."
call :say "EN: Tracing the route to the internet, please wait up to a minute..."
call :run "Маршрут / Marshrut / Route: 77.88.8.8" "%SYS%\tracert.exe -d -h 15 -w 800 77.88.8.8"
call :run "Таблица маршрутов / Tablitsa marshrutov / Routing table" "%SYS%\route.exe print"
rem Подписи итога. Роутер, молчащий на ping при живом интернете, - норма, не поломка.
set "T_OK=OK"
set "T_NO=НЕТ / NET / FAIL"
set "T_GW=%T_NO%"
if "%R_GW%"=="OK" set "T_GW=%T_OK%"
if "%R_GW%"=="NOTFOUND" set "T_GW=НЕ НАЙДЕН / NE NAYDEN / NOT FOUND"
if "%R_GW%"=="FAIL" if "%NET%"=="OK" set "T_GW=молчит на ping / molchit na ping / no ping reply"
set "T_IP=%T_NO%"
if "%R_IP%"=="OK" set "T_IP=%T_OK%"
if not "%R_IP%"=="OK" if "%R_WEB%"=="OK" set "T_IP=ping закрыт / ping zakryt / ping blocked"
set "T_WEB=%T_NO%"
if "%R_WEB%"=="OK" set "T_WEB=%T_OK%"
if "%R_WEB%"=="SKIP" set "T_WEB=не проверено / ne provereno / not checked"
set "T_DNS=%T_NO%"
if "%R_DNS%"=="OK" set "T_DNS=%T_OK%"
if not "%R_DNS%"=="OK" if "%R_WEB%"=="OK" set "T_DNS=через прокси / cherez proksi / via proxy"
call :say ""
call :say "=============================================================="
call :say " ИТОГ / ITOG / SUMMARY"
call :say " Роутер / Router / Gateway ................ %T_GW%"
call :say " Интернет по IP / Internet po IP / By IP .. %T_IP%"
call :say " Веб-страница / Veb-stranitsa / Web page .. %T_WEB%"
call :say " DNS, имена сайтов / imena saytov / names . %T_DNS%"
call :say "=============================================================="
rem Вердикт - от главного: есть ли интернет вообще. Роутер винить, только если его нет.
rem Открылась веб-страница - значит, и имена работают, хотя бы через прокси.
if "%R_WEB%"=="OK" goto v_ok
if "%NET%"=="OK" if "%R_DNS%"=="OK" goto v_ok
if "%NET%"=="OK" goto v_dns
if "%R_GW%"=="OK" goto v_ip
if "%R_GW%"=="NOTFOUND" goto v_nogw
goto v_gw
:v_ok
call :say "RU: Базовая связь в порядке. Если сайт не открывается, дело в нём или в браузере."
call :say "TR: Bazovaya svyaz v poryadke. Esli sayt ne otkryvaetsya, delo v nyom ili v brauzere."
call :say "EN: Basic connectivity is fine. If a site does not open, the problem is the site or the browser."
goto v_end
:v_nogw
call :say "RU: Компьютер не подключён к сети: нет основного шлюза. Проверьте кабель или Wi-Fi."
call :say "TR: Kompyuter ne podklyuchyon k seti: net osnovnogo shlyuza. Proverte kabel ili Wi-Fi."
call :say "EN: The computer is not connected: there is no default gateway. Check the cable or Wi-Fi."
goto v_end
:v_gw
call :say "RU: Роутер не отвечает и интернета нет: проверьте кабель или Wi-Fi и перезагрузите роутер."
call :say "TR: Router ne otvechaet i interneta net: proverte kabel ili Wi-Fi i perezagruzite router."
call :say "EN: The router does not respond and there is no internet: check the cable or Wi-Fi and restart the router."
goto v_end
:v_ip
call :say "RU: Роутер отвечает, а интернета нет: вероятно, провайдер или настройки роутера."
call :say "TR: Router otvechaet, a interneta net: veroyatno, provayder ili nastroyki routera."
call :say "EN: The router responds but there is no internet: likely the provider or router settings."
goto v_end
:v_dns
call :say "RU: Интернет есть, но имена сайтов не находятся: проблема с DNS."
call :say "TR: Internet est, no imena saytov ne nakhodyatsya: problema s DNS."
call :say "EN: The internet works but site names do not resolve: a DNS problem."
:v_end
call :say ""
call :say "Отчёт / Otchyot / Report: %LOG%"
call :say "RU: Отправьте этот файл специалисту."
call :say "TR: Otpravte etot fayl spetsialistu."
call :say "EN: Send this file to your IT specialist."
del "%TMPF%" >nul 2>nul
rem Отчёт в 866 Блокнот показывает кракозябрами. Где есть PowerShell
rem (Windows 7 и новее), перекладываем его в UTF-8 с меткой BOM и открываем.
rem Без PowerShell (XP) не открываем: всё нужное уже видно в окне.
set "NETDIAG_LOG=%LOG%"
powershell -NoProfile -Command "$p=$env:NETDIAG_LOG; $t=[IO.File]::ReadAllText($p,[Text.Encoding]::GetEncoding(866)); [IO.File]::WriteAllText($p,$t,(New-Object Text.UTF8Encoding $true))" >nul 2>nul
if not errorlevel 1 start "" notepad "%LOG%"
echo.
echo Нажмите любую клавишу / Nazhmite lyubuyu klavishu / Press any key to close.
pause >nul
if defined OCP chcp %OCP% >nul
endlocal
goto :eof
rem Строка и на экран, и в отчёт. Через отложенное раскрытие, чтобы путь
rem с амперсандом или скобкой не ломал команду.
:say
set "SAY=%~1"
setlocal EnableDelayedExpansion
echo.!SAY!
>>"!LOG!" echo.!SAY!
endlocal
goto :eof
rem Один основной шлюз: только IPv4-адрес, без повторов; ping и отметка.
:gw
echo %~1| "%FS%" /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$" >nul || goto :eof
echo %GWS%| "%FS%" /l /c:";%~1;" >nul && goto :eof
set "GWS=%GWS%%~1;"
if not "%R_GW%"=="OK" set "R_GW=FAIL"
call :run "Роутер / Router / Gateway %~1" "%SYS%\ping.exe -n 4 -w 1000 %~1"
"%FS%" /l /c:"TTL=" "%TMPF%" >nul && set "R_GW=OK"
goto :eof
rem Заголовок, команда; вывод через временный файл: на экран и в отчёт.
:run
call :say ""
call :say "=== %~1 ==="
%~2 >"%TMPF%" 2>&1
type "%TMPF%"
type "%TMPF%" >>"%LOG%"
goto :eof
Распределение по парам и группам
Случайно делит людей на пары или группы — для тренинга, разминки, дежурств или код-ревью. Всё считается в вашем браузере, имена никуда не отправляются.
Участников: 0
Если поровну не делится, лишние добавятся в группы: 7 человек по парам — две пары и тройка.
Ctrl + Enter — перемешать ещё раз. Список запоминается только в этом браузере.