Pinging a Hostname with Timeout
Well, that's simple:
$ping = New-Object System.Net.NetworkInformation.Ping;
[bool]($ping.Send($computer, $pingTimeout).Status -ne 'Success');
It gets more interesting when we need to verify that $computer is actually valid. We can use [System.Net.DNS]::GetHostAddresses(), but that emits an error if the host doesn't exist, which can be disconcerting if we're trying to write something that looks pretty. In this case, we'll use trap {} to suppress the error message and get on with our lives:
& {trap { continue; } $script:hostEntry = [System.Net.Dns]::GetHostEntry($computer); }
[bool]$script:hostEntry ;
Put it all together, and we get:
function Ping-Computer {
param (
[string]$computer,
[int]$pingTimeout = 1000 # in milliseconds
);
if (!$computer) {
Write-Warning "-computer not specified, required.";
return $false;
}
$script:hostEntry = $null;
& { trap { continue; } $script:hostEntry = [System.Net.Dns]::GetHostEntry($computer); }
if (!$script:hostEntry) {
Write-Warning "$computer is not known.";
return $false;
}
$script:pingStatus = $null;
& { trap { continue; } $script:pingStatus = (New-Object System.Net.NetworkInformation.Ping).Send($computer, $pingTimeout).Status; }
if ($script:pingStatus -ne 'Success') {
Write-Warning "$computer is not pingable.";
return $false;
}
return $true;
}
Comments
- Anonymous
June 24, 2011
Here's one that works for a list of computers: function Ping-Computer { param ( [string[]]$computer = @(), [int]$timeout = 1, [switch]$one ); foreach ($myComputer in $computer) { if (!$myComputer) { continue; } Write-Verbose "Processing $myComputer"; $pingStatus = $null; & { trap { Write-Warning "${computer}: $($_.Exception.Message)"; continue; } (New-Object System.Net.NetworkInformation.Ping).Send($myComputer,$timeout * 1000).Status | Set-Variable -Scope 1 -Name pingStatus; } if ($one) { $pingStatus -eq 'Success'; break; } else { $pingStatus | Select-Object -Property @{ name = 'name'; expression = { $myComputer; } }, @{ name = 'status'; expression = { $pingStatus -eq 'Success' } } } } }