Оболочка, работающая с объектами
PowerShell — оболочка и язык сценариев Microsoft. Главное отличие от cmd: команды, называемые командлетами, возвращают не текст, а объекты со свойствами. Поэтому результат можно фильтровать, сортировать и подставлять в следующую команду без ручного разбора строк.
Имена командлетов построены по схеме «глагол-существительное»: Get-, Set-, Test-, Resolve-. Получив общую логику, вы часто догадываетесь о названии нужной команды сами.
В современных версиях Windows PowerShell установлен сразу, а рядом существует кроссплатформенная редакция с отдельным номером версии. Интерфейс командной строки в PowerShell обладает автодополнением, подсветкой синтаксиса и историей, что делает работу заметно удобнее.
Что проверить по сети
Test-NetConnection с параметрами -ComputerName и -Port проверяет доступность конкретного порта на узле; без порта он использует ping. Get-NetIPConfiguration показывает адреса, шлюзы и DNS-серверы адаптеров, Get-NetAdapter — состояние самих адаптеров и скорость соединения. Resolve-DnsName запрашивает записи DNS аналогично nslookup, но с более подробным результатом.
Для соединений подходит Get-NetTCPConnection: он выводит локальные и удалённые адреса, порты, состояния и идентификаторы процессов. Get-DnsClientCache показывает содержимое кеша, а Clear-DnsClientCache очищает его.
Кроме перечисленного, полезен Get-NetRoute для просмотра таблицы маршрутов и Get-NetIPAddress для списка адресов интерфейсов. Get-DnsClientServerAddress покажет, какие DNS-серверы назначены каждому адаптеру, а Get-NetFirewallProfile — состояние встроенного брандмауэра.
Как читать результаты
Test-NetConnection выводит поле TcpTestSucceeded: значение True значит, что соединение с портом установлено. Это точнее ping, ведь проверяется реальное подключение к службе, а не просто отклик хоста. Если False, причина может быть как в сети, так и в фильтрации или выключенной службе на другой стороне.
В Get-NetTCPConnection полезно смотреть состояние: Established — соединение активно, Listen — служба ждёт подключений, TimeWait — соединение закрыто, но ещё удерживается.
Особенно наглядно поле PingSucceeded: оно сообщает, отвечает ли узел на эхо-запрос, независимо от того, открыт ли нужный порт. Комбинация PingSucceeded True и TcpTestSucceeded False указывает, что сам сервер работает, но нужная служба либо не запущена, либо закрыта фильтром.
Приёмы, экономящие время
Конвейер связывает команды: Get-NetTCPConnection | Where-Object State -eq Established оставит только активные соединения. Сортировка и выбор нужных полей делаются через Sort-Object и Select-Object. Формат вывода можно изменить на таблицу или список, а результат — экспортировать в CSV для сравнения.
Справку вызывает Get-Help с именем командлета, а Get-Command с шаблоном подсказывает, какие команды вообще есть в нужной области.
Если результат нужно передать коллеге, добавьте после команды вызов Export-Csv с путём к файлу, и получите таблицу, удобную для сравнения до и после изменений. Аналогичные возможности даёт ConvertTo-Json для выгрузки в структурированном виде.
Границы и ошибки
Часть командлетов требует запуска от имени администратора, иначе вы увидите ошибку доступа. Политика выполнения сценариев по умолчанию ограничивает запуск скриптов-файлов, но вводить команды вручную это не мешает. Команды Set- и Remove- меняют настройки, поэтому запускайте их только понимая последствия.
Частое заблуждение: PowerShell есть только в Windows. Существует и версия для Linux и macOS, но набор сетевых командлетов, о которых речь выше, относится к Windows.
Ошибки вида «не удаётся найти командлет» чаще всего связаны с опечаткой либо с тем, что модуль не подключён в этой редакции оболочки. Читайте текст сообщения целиком: там обычно указано, какая часть команды не распознана.
Как попробовать
Откройте поиск и введите PowerShell. Выполните Get-NetIPConfiguration, затем Test-NetConnection с адресом сайта и портом 443. Сравните результат с обычным ping. Так вы увидите, что порт доступен, даже если ping не проходит, и наоборот.
Попробуйте ещё Resolve-DnsName для домена и сравните результат с ответом другого DNS-сервера, указав его параметром -Server: так видно, различаются ли ответы разных серверов для одного имени.