我正在尝试创建一个脚本,该脚本会给出一个UNC共享列表,通过ping响应时间对它们进行排序。 我设法想出一些感觉非常像黑客的东西,我想知道是否有人更好地了解如何在“权力机构精神”中完成它?
这是我难看的解决方案:
$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
}
答案 0 :(得分:4)
当你想要做的就是排序时,只需使用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。在这种情况下,您可以使用ping的结果添加NoteProperty
,但添加名为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对象,然后将Share名称添加回它是这样的:
$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}}
这使得你可以拥有截然不同的输出,因为你将多个对象组合在一起......
答案 1 :(得分:0)
这是一个“折叠”的单行:
@(foreach ($unc in $list){
test-connection $unc.split("\")[2] |
measure responsetime -average |
% {$_.average.tostring() + " $unc"}}) |
sort |% {$_.split()[1]}
如果要保存并显示ResponseTimes,请将最后一行替换为:
sort | select @{l="Share";e={$_.split()[1]}},@{l="ResponseTime";e={"{0:F2}" -f $_.split()[0]}}