当您只想进行排序时,只需使用 ScriptBlock 进行排序:
cat .\uncshares.txt | Sort { Test-Connection -Count 1 -CN $_.split('\')[2] }
或者,您可以使用平均值:
cat .\uncshares.txt | Sort { Test-Connection -Count 3 -CN $_.split('\')[2] | Measure ResponseTime -Average | Select -Expand Average }
确实,当您想向对象添加数据时,您应该使用 Add-Member。在这种情况下,您可以NoteProperty
在 ping 的结果中添加 a,但更有趣的是添加名为 ping 的脚本属性(或方法)来实际执行ping。也就是说,当您调用 ping 成员时,它会执行 ping 操作:
$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
您也可以使用此方法使用平均值:
$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
作为 Add-Member 的替代方法(当您不想每次都重新 ping 时),您可以使用 Select-Object 构建对象,这样您就可以创建一个 Ping 对象,然后像这样将共享名称添加回它:
$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}}
这允许您获得截然不同的输出,因为您将多个对象组合在一起......