Using the Test-Connection in an enterprise environment, I often miss the -a parameter of the old ping command, that tells ping to try to resolve IP address to HostName.
So I sat down and created a proxy function for Test-Connection, adding a Resolve parameter. It’s quite simple actually, it’s checks the ComputerName parameter, and if the data is a valid IP address tries to resolve using the Net.Dns class. It then takes the resolved name and injects it back into the ComputerName parameter before calling the original Test-Connection command.
There is one drawback of using proxies with the same name as existing commands though, and that is that Get-Help with not work as you are used to. There is two ways of “fixing” this problem:
- Call Get-Help like this:
Get-Help Test-Connection -Category Function
- Add the following line to your PowerShell profile:
(Get-Command Microsoft.PowerShell.Management\Test-connection).Visibility = 'Private'
Code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Test-Connection { | |
[CmdletBinding(DefaultParameterSetName='Default', HelpUri='http://go.microsoft.com/fwlink/?LinkID=135266', RemotingCapability='OwnedByCommand')] | |
param( | |
[Parameter(ParameterSetName='Default')] | |
[Parameter(ParameterSetName='Source')] | |
[switch] | |
${AsJob}, | |
[System.Management.AuthenticationLevel] | |
${Authentication}, | |
[Alias('Size','Bytes','BS')] | |
[ValidateRange(0, 65500)] | |
[int] | |
${BufferSize}, | |
[Parameter(Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)] | |
[Alias('CN','IPAddress','__SERVER','Server','Destination')] | |
[ValidateNotNullOrEmpty()] | |
[string[]] | |
${ComputerName}, | |
[ValidateRange(1, 4294967295)] | |
[int] | |
${Count}, | |
[Parameter(ParameterSetName='Source')] | |
[ValidateNotNullOrEmpty()] | |
[pscredential] | |
[System.Management.Automation.CredentialAttribute()] | |
${Credential}, | |
[Parameter(ParameterSetName='Source', Mandatory=$true, Position=1)] | |
[Alias('FCN','SRC')] | |
[ValidateNotNullOrEmpty()] | |
[string[]] | |
${Source}, | |
[System.Management.ImpersonationLevel] | |
${Impersonation}, | |
[Parameter(ParameterSetName='Source')] | |
[Parameter(ParameterSetName='Default')] | |
[ValidateRange(-2147483648, 1000)] | |
[int] | |
${ThrottleLimit}, | |
[Alias('TTL')] | |
[ValidateRange(1, 255)] | |
[int] | |
${TimeToLive}, | |
[ValidateRange(1, 60)] | |
[int] | |
${Delay}, | |
[Parameter(ParameterSetName='Quiet')] | |
[switch] | |
${Quiet}, | |
[Parameter()] | |
[switch] | |
${Resolve}) | |
begin | |
{ | |
try { | |
$outBuffer = $null | |
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) | |
{ | |
$PSBoundParameters['OutBuffer'] = 1 | |
} | |
if ($PSBoundParameters['Resolve']) { | |
$null = $PSBoundParameters.Remove('Resolve') | |
foreach ($item in $ComputerName) { | |
try { | |
$item -match [IPAddress]$item | |
[string[]]$ComputerNameEx += ([System.Net.Dns]::GetHostEntry($item)).HostName | |
} | |
catch { | |
[string[]]$ComputerNameEx += $item | |
} | |
} | |
$PSBoundParameters['ComputerName'] = $ComputerNameEx | |
} | |
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Management\Test-Connection', [System.Management.Automation.CommandTypes]::Cmdlet) | |
$scriptCmd = {& $wrappedCmd @PSBoundParameters } | |
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) | |
$steppablePipeline.Begin($PSCmdlet) | |
} catch { | |
throw | |
} | |
} | |
process | |
{ | |
try { | |
$steppablePipeline.Process($_) | |
} catch { | |
throw | |
} | |
} | |
end | |
{ | |
try { | |
$steppablePipeline.End() | |
} catch { | |
throw | |
} | |
} | |
<# | |
.ForwardHelpTargetName Test-Connection | |
.ForwardHelpCategory Cmdlet | |
#> | |
} |