Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell-如何通过ping响应时间对UNC路径进行排序_Powershell_Ping_Unc - Fatal编程技术网

Powershell-如何通过ping响应时间对UNC路径进行排序

Powershell-如何通过ping响应时间对UNC路径进行排序,powershell,ping,unc,Powershell,Ping,Unc,我正在尝试制作一个脚本,该脚本将给出一个UNC共享列表,并根据它们的ping响应时间对它们进行排序。 我已经设法想出了一些感觉很像黑客的东西,我想知道是否有人有更好的想法,如何在纯粹的“powershell精神”中做到这一点 这是我丑陋的解决方案: $shares = Get-Content unc_shares.txt | where {Test-Path $_} $servers = $shares | ForEach-Object {$_.Substring(2, $_.IndexOf("

我正在尝试制作一个脚本,该脚本将给出一个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
}
这是一个“折叠”的单层衬里:

   @(foreach ($unc in $list){
      test-connection $unc.split("\")[2] |
       measure responsetime -average |
        % {$_.average.tostring() + " $unc"}}) |
         sort |% {$_.split()[1]}
如果要保存和显示响应时间,请将最后一行替换为:

sort | select @{l="Share";e={$_.split()[1]}},@{l="ResponseTime";e={"{0:F2}" -f $_.split()[0]}}
这是一个“折叠”的单层衬里:

   @(foreach ($unc in $list){
      test-connection $unc.split("\")[2] |
       measure responsetime -average |
        % {$_.average.tostring() + " $unc"}}) |
         sort |% {$_.split()[1]}
如果要保存和显示响应时间,请将最后一行替换为:

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

当您只想进行排序时,只需使用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 }
确实,当您想向对象添加数据时,应该使用addmember。在本例中,您可以添加一个带有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
作为添加成员的替代方法(当您不希望每次都重新ping时),您可以使用“选择对象”构建对象,这样您就可以创建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}}

这使您可以获得完全不同的输出,因为您要将多个对象组合在一起…

当您只需要进行排序时,只需使用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 }
确实,当您想向对象添加数据时,应该使用addmember。在本例中,您可以添加一个带有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
作为添加成员的替代方法(当您不希望每次都重新ping时),您可以使用“选择对象”构建对象,这样您就可以创建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}}

这使您可以获得完全不同的输出,因为您将多个对象组合在一起…

不幸的是,这似乎不起作用。它可以很好地计算每个共享的响应时间(使用split获取服务器名是个好主意!),但它仍然总是按照在输入列表中输入unc路径的顺序返回unc路径。不知道该告诉你什么。我使用以下测试数据运行它:$list=“\\www.google.com\stuff\otherstuff”、“\\www.stackoverflow.com\knowlege”、“\\localhost\test”,然后将-desc添加到排序中并重新运行,所有内容都以相反的顺序显示。我只是尝试重新排列输入列表的顺序,输出顺序保持不变。我无法重新创建您描述的结果。对不起,我刚刚意识到我测试的内容与我发布的内容不完全一致。我将更新发布的脚本。然后我再去喝一杯咖啡。不幸的是,这似乎不起作用。它可以很好地计算每个共享的响应时间(使用split获取服务器名是个好主意!),但它仍然总是按照在输入列表中输入unc路径的顺序返回unc路径。不知道该告诉你什么。我使用以下测试数据运行它:$list=“\\www.google.com\stuff\otherstuff”、“\\www.stackoverflow.com\knowlege”、“\\localhost\test”,然后将-desc添加到排序中并重新运行,所有内容都以相反的顺序显示。我只是尝试重新排列输入列表的顺序,输出顺序保持不变。我无法重新创建您描述的结果。对不起,我刚刚意识到我测试的内容与我发布的内容不完全一致。我将更新发布的脚本。然后我再去喝杯咖啡。