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}
        }
    }