Как отсортировать строку по ее числовому значению в PowerShell - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать скрипт, который будет перечислять серверы, которые мне нужно перечислить, а также задержку, возвращаемую с каждого сервера, мне нужно, чтобы список был в порядке возрастания или убывания на основе ping.

То, что я до сих пор придумал, дало в основном то, что я хочу, но если на одном сервере возвращенный пинг выше 100, другие значения считаются выше, если они начинаются со значения выше 1.

Я понимаю, что мне нужно значение ping, возвращаемое в виде целого числа, но я не смог точно определить, как этого добиться без удаления имени сервера.

В любом случае, вот что япридумайте пока

function TestNetwork {
    $global:array = @("<ServerName>:<ipaddress>"; "<ServerName>:<ipaddress>"; "<ServerName>:<ipaddress>")

    foreach ($str in $global:array) {
        $avg = 0
        $server = $($str -split ":")[0]
        $PingServer = Test-Connection -Count 3 $server
        $avg = ($PingServer | Measure-Object ResponseTime -Average)
        $calc = [System.Math]::Round($avg.Average)
        $output = "{000} | " -f $($calc) + $server
        $Output
    }
}
TestNetwork | Sort numerical -Descending `

и вот результаты, которые я получаю

75 | Server    
73 | Server  
110 | Server  

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Существует несколько способов решения вашей проблемы.

Вы можете отформатировать число таким образом, чтобы выровнять порядок сортировки целых чисел и порядок сортировки строк, как Предложенные LotPings :

'{0,3} | {1}' -f $calc, $server

Вы также можете извлечь число из строки, преобразовать его обратно в целое число и использовать его в качестве свойства сортировки:

... | Sort-Object {[int]($_ -replace '(\d+).*', '$1')} -Descending

Однако я бы не сталпосоветуйте любой подход.Способ PoSh состоит в том, чтобы работать с объектами, как указал Олаф , поэтому оборачивайте ваши данные в пользовательских объектах и ​​конвертируйте их в строки, только если у вас есть для этого причина (например, для создания текстового вывода):

foreach ($str in $global:array) {
    ...
    New-Object -Type PSObject -Property ([ordered]@{
        'ComputerName' = $server
        'ResponseTime' = $calc
    })
}

Таким образом, вы можете "естественно" отсортировать данные:

TestNetwork | Sort ResponseTime -Descending | ForEach-Object {
    '{0,3} | {1}' -f $_.ResponseTime, $_.ComputerName
}

или

TestNetwork | Sort ResponseTime -Descending | Export-Csv 'output.csv' -NoType
0 голосов
/ 26 апреля 2018

Вот альтернатива тому, как вы делаете вещи, которые дадут вывод, который будет легче сортировать и форматировать:

function Test-Network
{
    $array = ("<ServerName>","<ipaddress>"), ("<ServerName>","<ipaddress>"), ("<ServerName>","<ipaddress>")

    $array | ForEach-Object {                            
        [PsCustomObject]@{
            AvgResponse = [Math]::Round((Test-Connection -Count 3 $_[0] | Measure-Object ResponseTime -Average).Average)
            Server = $_[0]
        }
    }
}

Test-Network | 
    Sort-Object AvgResponse -Descending

Вывод будет выглядеть следующим образом:

AvgResponse Server  
----------- ------  
        363 server1
         12 server2
          2 server3

Преимущество вывода пользовательских объектов, подобных этому, а не строк, состоит в том, что вы можете использовать дополнительные методы PowerShell для вывода, такие как сортировка, группировка и т. Д.

Обратите внимание на несколько других моментов:

  • Если вы не собираетесь использовать свой массив вне функции, нет необходимости объявлять его как «глобальный»
  • Если вам действительно не нужны имена в формате "<ServerName>:<ipaddress>", рассмотрите возможность их храненияпо-другому.Я использовал массив массивов, что облегчает работу в этом случае, поскольку вам не нужно каждый раз разбивать строку.
  • Вы должны называть свои функции в соответствии со стандартом именования PowerShell Verb-Noun.так что Test-Network, а не TestNetwork.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...