2015-09-07 8 views
10

私はPSVersion 2.0を使用しています。私はそれに相当するtracerouteがあるのでしょうか?バージョン2で動作するPowerShell相当のtracertはありますか?

PowerShell v4には、tracertを実行するTest-NetConnectionコマンドレットがありますが、v2はありますか?これと同様に行うことができますコメントで述べたように

Test-NetConnection "IPaddress/HOSTaname" -TraceRoute 

おかげ

+1

あなたはあなただけの出力は、自分が –

+0

感謝の男、あなたは私をたくさん助けてきた解析する必要があり、PowerShellの元 'tracert.exe'を使用することができます! – Sylca

答えて

17

を、あなたはtracert.exeからの出力を解析することにより、独自の「貧困・マン - PowerShellの-のtracert」を作ることができます。

function Invoke-Tracert { 
    param([string]$RemoteHost) 

    tracert $RemoteHost |ForEach-Object{ 
     if($_.Trim() -match "Tracing route to .*") { 
      Write-Host $_ -ForegroundColor Green 
     } elseif ($_.Trim() -match "^\d{1,2}\s+") { 
      $n,$a1,$a2,$a3,$target,$null = $_.Trim()-split"\s{2,}" 
      $Properties = @{ 
       Hop = $n; 
       First = $a1; 
       Second = $a2; 
       Third = $a3; 
       Node = $target 
      } 
      New-Object psobject -Property $Properties 
     } 
    } 
} 
デフォルトでは

、PowerShellの書式リストで5つの以上の特性を持つオブジェクトが、あなたはFormat-Tabletracert様の出力を得ることができます:

enter image description here

+0

あなたは間違いなくここで余分なマイルに行きました。よくやった! –

+0

ありがとうございました!私は@MikeShepardに同意します – Sylca

3

私は誰かがすでにこれをしたかどうかを知りたがっています。

あなたはPowerShellのスクリプトここ

、高速に動作し、プライマー、しかし、危険と-SO-貧しいない - マン-のtracerouteを実装するための.NET Frameworkを使用することができます。 また、統計もありません。

# 
# Mid-Waged-Mans-Tracert 
# 

$ping = new-object System.Net.NetworkInformation.Ping 
$timeout = 5000 
$maxttl = 64 
$address = [string]$args 
$message = [System.Text.Encoding]::Default.GetBytes("MESSAGE") 
$dontfragment = false 
$success = [System.Net.NetworkInformation.IPStatus]::Success 

echo "Tracing $address" 
for ($ttl=1;$i -le $maxttl; $ttl++) { 
    $popt = new-object System.Net.NetworkInformation.PingOptions($ttl, $dontfragment) 
    $reply = $ping.Send($address, $timeout, $message, $popt) 


    $addr = $reply.Address 
    $rtt = $reply.RoundtripTime 
    try { 
     $dns = [System.Net.Dns]::GetHostByAddress($addr) 
    } catch { 
     $dns = "-" 
    } 

    $name = $dns.HostName 

    echo "Hop: $ttl`t= $addr`t($name)" 
    if($reply.Status -eq $success) {break} 
} 

編集:

は、catchステートメントを追加することにより、危険の一部を削除しました。まだ存在している のみ危険は、我々がないを行うことを意味する可能性があり、我々は唯一のホップごとに単一のリクエストを送信しているという事実は、無実パッケージドロップによるホップに到達されます。 この問題を解決することは、依然として読者の練習です。 ヒント:(ループ内のループを考える)

ボーナス:今度は各ホップのDNSエントリを取得しようとしています!

+0

ニース "ネイティブ"アプローチ、素晴らしい!たぶん「危険」を説明していますか? :-) –

+1

冗長性の欠如(1つのicmpメッセージが失われた場合、その特定のホップの結果は得られません)+ PingExceptionをキャッチしなかったという危険性があります。 – MrPaulch

4

"Mid-Waged-Mans-Tracert"バージョンのいくつかのバグを修正し、モジュール化してカスタマイズを追加しました。 @マールポールは大きなPoCを持っていた。

function Invoke-Traceroute{ 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$true,Position=1)] 
     [string]$Destination, 

     [Parameter(Mandatory=$false)] 
     [int]$MaxTTL=16, 

     [Parameter(Mandatory=$false)] 
     [bool]$Fragmentation=$false, 

     [Parameter(Mandatory=$false)] 
     [bool]$VerboseOutput=$true, 

     [Parameter(Mandatory=$false)] 
     [int]$Timeout=5000 
    ) 

    $ping = new-object System.Net.NetworkInformation.Ping 
    $success = [System.Net.NetworkInformation.IPStatus]::Success 
    $results = @() 

    if($VerboseOutput){Write-Host "Tracing to $Destination"} 
    for ($i=1; $i -le $MaxTTL; $i++) { 
     $popt = new-object System.Net.NetworkInformation.PingOptions($i, $Fragmentation) 
     $reply = $ping.Send($Destination, $Timeout, [System.Text.Encoding]::Default.GetBytes("MESSAGE"), $popt) 
     $addr = $reply.Address 

     try{$dns = [System.Net.Dns]::GetHostByAddress($addr)} 
     catch{$dns = "-"} 

     $name = $dns.HostName 

     $obj = New-Object -TypeName PSObject 
     $obj | Add-Member -MemberType NoteProperty -Name hop -Value $i 
     $obj | Add-Member -MemberType NoteProperty -Name address -Value $addr 
     $obj | Add-Member -MemberType NoteProperty -Name dns_name -Value $name 
     $obj | Add-Member -MemberType NoteProperty -Name latency -Value $reply.RoundTripTime 

     if($VerboseOutput){Write-Host "Hop: $i`t= $addr`t($name)"} 
     $results += $obj 

     if($reply.Status -eq $success){break} 
    } 

    Return $results 
} 
関連する問題