1

我正在尝试制作一个脚本,该脚本将给出一个 UNC 共享列表,按它们的 ping 响应时间对它们进行排序。我设法想出了一些感觉很像黑客的东西,我想知道是否有人有更好的想法如何纯粹以“powershell精神”来做?

这是我丑陋的解决方案:

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

2 回答 2

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。在这种情况下,您可以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}}

这允许您获得截然不同的输出,因为您将多个对象组合在一起......

于 2011-01-17T15:09:21.767 回答
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]}}
于 2011-01-17T03:30:45.637 回答