2011-01-16 8 views
1

Ich versuche, ein Skript, das eine Liste der UNC-Freigaben gegeben würde, ordnen sie nach ihrer Ping-Antwortzeit. Ich habe es geschafft, etwas zu finden, das sich ziemlich wie ein Hack anfühlt und ich frage mich, ob jemand eine bessere Idee hat, wie man es rein in "Powershell Spirit" macht?Powershell - wie UNC-Pfade durch Ping-Antwortzeit sortiert werden

Dies ist meine hässliche Lösung:

$shares = Get-Content unc_shares.txt | where {Test-Path $_} 
$servers = $shares | ForEach-Object {$_.Substring(2, $_.IndexOf("\", 3) - 2)} 

$sortedServers = ($servers | 
    ForEach-Object -Process {(Get-WmiObject Win32_PingStatus -filter "Address='$_'")} | 
    sort ResponseTime | 
    select Address) 

foreach($server in $sortedServers) 
{ 
    $shares | where {$_.Contains($server.Address)} | Out-File $sortedListPath -append 
} 

Antwort

4

Wenn Sie nur sortieren möchten, verwenden Sie einfach einen ScriptBlock zum Sortieren nach:

cat .\uncshares.txt | Sort { Test-Connection -Count 1 -CN $_.split('\')[2] } 

Oder könnten Sie einen Durchschnitt verwenden:

cat .\uncshares.txt | Sort { Test-Connection -Count 3 -CN $_.split('\')[2] | Measure ResponseTime -Average | Select -Expand Average } 

Es ist wahr, dass, wenn Sie Daten zu einem Objekt hinzufügen möchten, sollten Sie Add-Member. In diesem Fall könnten Sie ein NoteProperty mit dem Ergebnis des Ping hinzufügen, aber es ist interessanter, eine Script-Eigenschaft (oder Methode) namens ping hinzuzufügen, die tatsächlich ausführen würde der Ping. Das heißt, es wird das Ping tun, wenn Sie das Ping-Mitglied anrufen:

$Shares = cat .\uncshares.txt | Add-Member ScriptProperty Ping -Passthru -Value { 
      Test-Connection $this.split('\')[2] -Count 1 | 
      Select -Expand ResponseTime } 

# Each time you sort by it, it will re-ping, notice the delay: 
$Shares | Sort Ping 

Sie den Durchschnitt mit dieser Methode verwenden:

$Shares = cat .\uncshares.txt | Add-Member ScriptProperty Ping -Passthru -Value { 
      (Test-Connection $this.split('\')[2] -Count 3 | 
      Measure ResponseTime -Average).Average } 

# But this will take even longer: 
$Shares | Sort Ping 

Als Alternative zur Add-Member (wenn Sie tun NICHT wollen jedes Mal neu ping), können Sie Select-Object aufbauen Objekte verwenden, so könnten Sie ein Ping-Objekt erstellen und dann den Freigabenamen wie so etwas hinzufügen zurück:

$unc = cat .\uncshares.txt 

## Gotta love backslashes in regex. Not... 
$unc -replace '\\\\([^\\]+)\\.*','$1' | 
    Test-Connection -Count 1 -CN {$_} | 
    Sort ResponseTime | 
    Select @{n='Server';e={$_.Address}}, 
      @{n='Share'; e={$unc -match $_.Address}}, 
      @{n='Ping'; e={$_.ResponseTime}} 

das erlaubt Ihnen, drastisch anders haben Miete-Ausgabe, weil Sie mehrere Objekte zusammen kombinieren ...

0

Hier ist ein „gefalteter“ Einzeiler:

@(foreach ($unc in $list){ 
     test-connection $unc.split("\")[2] | 
     measure responsetime -average | 
     % {$_.average.tostring() + " $unc"}}) | 
     sort |% {$_.split()[1]} 

Wenn Sie die ResponseTimes speichern und anzuzeigen, ersetzen die letzte Zeile mit:

sort | select @{l="Share";e={$_.split()[1]}},@{l="ResponseTime";e={"{0:F2}" -f $_.split()[0]}} 
+0

Leider scheint dies nicht den Trick zu tun. Es berechnet nett die Antwortzeit für jede Freigabe (gute Idee, Split zu verwenden, um den Servernamen zu erhalten!), Aber es gibt immer noch unc Pfade in der Reihenfolge zurück, in der sie in der Eingabeliste eingetragen sind. – Newanja

+0

Ich weiß nicht, was ich Ihnen sagen soll. Ich führe es mit diesen Testdaten aus: $ list = "\\ www.google.com \ stuff \ othersstuff", "\\ www.stackoverflow.com \ knowlege", "\\ localhost \ test" und füge dann -desc hinzu sortieren und wiederholen, alles kommt in umgekehrter Reihenfolge. – mjolinor

+0

Ich habe gerade versucht, die Reihenfolge der Eingabeliste neu anzuordnen, und die Reihenfolge der Ausgabe bleibt gleich. Ich kann die Ergebnisse, die Sie beschreiben, nicht erneut erstellen. – mjolinor

Verwandte Themen