PowerShell: ping? może Test-Connection lub Test-NetConnection?

Jak sprawdzić dostępność adresu IP, nazwy DNS? Każdemu przychodzi do głowy polecenie PING. To sprawdzone rozwiązanie chociaż jest ono w środowisku Windows dość ograniczone w parametry. Całe szczęście mamy PowerShella i możemy „łączyć” ping z jego możliwościami lub użyć innych poleceń . Jeżeli jesteście ciekawi w jaki sposób uzyskać timetamp przy pingu? Jak pingować kilka adresów jednocześnie albo w jakis sposób sprawdzić dostępność portu w PowerShell…. czytajcie dalej

Użyjmy więc trzech poleceń jednocześnie, dla każdego z pozoru proste zadanie sprawdzenia dostępności adresu 1.1.1.1:

ping 1.1.1.1

Test-Connection 1.1.1.1

Test-NetConnection

Różnice widać od razu, najwięcej informacji zwróci nam ostatnie polecenie ja jednak nie będę przepisywął informacji z pomocy, za to gorąco was do niej odsyłam. To co najważniejsze to że Test-NetConnection pozwoli nam sprawdzić nawet dostępność określonego portu i dowiemy się z jakiego interfejsu wysłaliśmy zapytanie:

Test-NetConnection nie pozwoli nam jednak sprawdzić kilku adresów jednocześnie – tutaj musimy wrócić do trochę starszego polecenia Test-Connection :

$ip = "1.1.1.1","8.8.8.8","85.128.200.73"
Test-Connection $ip

A w jaki sposób uzyskać informacje o dokładnej dacie i czasie odpowiedzi? Niestety tak jak pisałem wcześniej Windowsowy ping nie ma odpowiedniego przełącznika/parametru zatem spróbujmy połączyć go z Get-Date :

ping 1.1.1.1 -t | Foreach {$_; Get-Date -Format "yyyy-MM-dd HH:mm:ss"}

Oczywiście można pobawić się w dowolne formatowanie wyników.

Idźmy o krok dalej, jak wyświetlić informacje tylko kiedy adres nie odpowiada?

$ip = "10.10.1.119"

while ($true) {
  $result = Test-NetConnection $ip -InformationLevel Quiet
  if (!$result) {
    Write-Host "Ping not available: $(Get-Date)"
  }
  Start-Sleep -Seconds 1
}


Oczywiście możemy modyfikować nasz skrypt do woli, tak aby uzyskać informacje tylko wtedy kiedy dany adres nie odpowiada na określonym porcie:

$target = "79.137.68.123"
$port = "3389"

while ($true) {
  $result = Test-NetConnection $target -Port $port -InformationLevel Quiet 
  if (!$result) {
    Write-Host "Port not available: $(Get-Date)"
  }
  Start-Sleep -Seconds 1
}

Prawda że sporo możliwości? Są to przykłady jednych z częściej używanych przeze mnie skryptów do „monitorowania” dostępności adresu/portu. Sprawdźcie sami!