В Windows 8 вы можете использовать Test-NetConnection
для получения функциональности, аналогичной классическим инструментам ping
и tracert
, а также для проверки состояния порта удаленной системы. К сожалению, параметры Test-NetConnection
относительно ограничены по сравнению с инструментами, которые он заменяет. Таким образом, одно это не будет хорошо служить для непрерывного монитора. К счастью, PowerShell очень хорошо подходит для сценариев. Вот строка с одной строкой (технически, несколько строк сведены в одну), которая будет постоянно проверять доступность порта и выводить результаты с метками времени на консоль.
cls;1..8|%{""};for(){$x=tnc 192.168.0.1 -Po 80;"$(Get-Date) $($x.TcpTestSucceeded)"}
Вот скриншот скрипта в действии. Здесь вы можете увидеть, почему я запустил скрипт с cls;1..8|%{""};
хотя это технически не нужно. Кроме того, вы можете видеть, что Test-NetConnection
около 9-10 секунд каждый раз, даже когда вы подключены к локальной сети.
Вот прокомментированная, многострочная версия скрипта. Это тот же код, только разложенный с включенным пошаговым руководством.
# CLS is a built-in alias for Clear-Host.
# This clears any pre-existing output from the console so we can start ours from the top.
cls;
# This takes the integers from 1 through 8 and pipes them to a ForEach-Object loop.
# (The percent symbol, "%", is a built-in alias for ForEach-Object.)
# Putting just a pair of double-quotes in the script block outputs a single blank line.
# Effectively, this line of script just outputs 8 blank lines.
# While Test-NetConnection runs, it puts a status display on the top 8 lines of the console.
# So, we're using this to make our output start below that level in order to be visible.
1..8|%{""};
# This begins an infinite for loop. It will run until aborted by the user.
# (e.g.: With CTRL+C)
# Note: Due to the way Test-NetConnection operates, the abort may take a few seconds to process.
for(){
# TNC is a built-in alias for Test-NetConnection.
# -Po is a shorthand for the -Port parameter name.
# PowerShell allows shortening of parameter names down to as few characters are needed to uniquely identify the parameter.
# This tests for connectivity to port 80 at 192.168.0.1 and puts the results in $x.
$x=tnc 192.168.0.1 -Po 80;
# The last step here is to output a timestamp, and the results.
# Double-quotes allow for per-processing certain elements before including them in an output string.
# Encapsulating script blocks with $(), within the double-quotes, lets us put their results directly in the output string.
# So, the first part gets the date and time for the start of the output.
# Then, with a space to separate it, the TcpTestSucceeded property of $x is retrieved and put at the end.
"$(Get-Date) $($x.TcpTestSucceeded)"
}
Он не такой чистый и простой, как хотелось бы, но он делает свою работу. Я определенно не ожидаю, что запомню его в ближайшее время, но как только вы поймете команды и основные принципы PowerShell, которые заставляют его работать, его сравнительно легко восстановить на лету.
Для чего-то более простого, который просто продолжает проверять порт и останавливается, чтобы сообщить вам, когда он работает, вы можете использовать это:
while((tnc 192.168.0.1 -Po 80).TcpTestSucceeded -eq $False){};Get-Date
Здесь мы используем цикл while для повторного тестирования порта, пока он не работает. После успешного подключения к порту цикл while завершается, и Get-Date сообщит время. Вы также увидите некоторые предупреждающие сообщения от Test-NetConnection
пока работает цикл - это потому, что он использует выходной канал Warning, чтобы сообщить о сбое соединения ping или порта, прежде чем он фактически отправит полные результаты как обычный вывод ,
К сожалению, Test-NetConnection
недоступен в системах, работающих под управлением Windows 8. Таким образом, здесь также отсутствует перекрестная совместимость, на которую я надеялся. Тем не менее, сейчас это лучше, чем ничего.