Trace.ps1
<#PSScriptInfo
.VERSION 2.0.1 .GUID 2bac578f-e37e-45e4-b231-0c3889a92fb4 .AUTHOR saw-friendship .COMPANYNAME .COPYRIGHT .TAGS trace tracert traaceroute .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> <# .DESCRIPTION Fast alternate tracert.exe #> param( [Parameter(Mandatory=$true,Position=0)][alias('IPAddress','HostName')]$HostAddress, [ValidateRange(1,10000)][alias('w','TimeOut')][int]$Delay = 96, [ValidateRange(1,65500)][alias('l','Size','Length')][int]$BufferSize = 16, [switch]$DontFragment, [switch]$ResolveDNS, [ValidateRange(1,255)][alias('h')][int]$TimeToLive = 32 ) [Hashtable[]]$select = @( ,@{Name = 'Hop'; Expression = {$i}} ,@{Name = 'TTL'; Expression = {$_.Options.ttl}} ,@{Name = 'Status'; Expression = {$_.Status}} ,@{Name = 'DontFragment'; Expression = {$_.Options.DontFragment}} ,@{Name = 'Address'; Expression = {$_.Address}} ,@{Name = 'RoundtripTime'; Expression = {$_.RoundtripTime}} ) if ($ResolveDNS) {$select += @{Name = 'HostnamePTR'; Expression = {[System.Net.Dns]::GetHostEntry($_.Address).Hostname}}} if (!($HostAddress -as [System.Net.IPAddress])){ $HostIP = [System.Net.Dns]::GetHostEntry($HostAddress).AddressList.IPAddressToString | Get-Random if(!$HostIP){break} } else { $HostIP = [System.Net.IPAddress]$HostAddress } [byte[]]$Buffer = [byte[]](1)*$BufferSize for($i = 1; $i -le $TimeToLive; $i++) { $Ping = New-Object -TypeName System.Net.NetworkInformation.Ping $PingOptions = New-Object -TypeName System.Net.NetworkInformation.PingOptions -ArgumentList @($i,$DontFragment) $Ping.Send($HostIP, $Delay, $Buffer, $PingOptions) | Select-Object -Property $select | % { $_.psobject.Typenames.Insert(0,'NetWork.Trace') $_ if($_.Address -eq $HostIP) {break} } } |