none
PowerShell. Сравнение элементов двух массивов. RRS feed

  • Вопрос

  • Здравствуйте!!

    Описание:

    Нужно допилить скрипт, его суть такова: в течении 30 секунд он слушает загрузку CPU в %, и полученные значения закидывает в массив переменной. Задается массив второй переменной с диапазоном. Количество элементов в этих двух массивах различное, в первом массиве 30 элементов, во втором  ~20 элементов (задается диапазон эквивалентный загруженности CPU грубо говоря 80..100). 

    Теперь сам вопрос, каким образом можно сравнить эти 2 массива, с условие что если совпадений больше или равно 50%, то выполнять определенное действие?

    Вот сам скрипт:

    $cpus = @()
    
    $i = 0
    while ($i -ne 30 )
    {
        Start-Sleep 1
        $CpuLoad = Get-WmiObject Win32_Processor| Measure-Object -property LoadPercentage -Maximum | Select Maximum
        $percente = $CpuLoad.Maximum
        $cpus +=@($percente)
        $i++
        
    }
      if ($cpus -gt 70)
        {
            Write-Host "Загрузка процессора превышает допустимую норму, перезапускаю IIS." -ForegroundColor Red
        }
        else
        {
            Write-Host "Загрузка процессора в пределах нормы, завершаю свою работу." -ForegroundColor Green
        }
    

    Заранее спасибо!

    18 декабря 2019 г. 13:06

Ответы

  • Тогда скажу проще.

    $arr1 = @(71,85,36,91,99,89,83,65,31,44)

    $arr2 = @(80..100)

    Как сравнить эти 2 массива на совпадение хотя бы 50% (в идеале 50% и больше) элементов от массива $arr1


    $arr1 = @(71,85,36,91,99,89,83,65,31,44,88)

    $ThresholdPercent = 50

    $persent = ($arr1 | ? { $_ -ge 80 -and $_ -le 100 }).Count * 100 / $arr1.Count

    if ($persent -ge $ThresholdPercent ) { 
        Write-Host -ForegroundColor red "Алярм! Больше $ThresholdPercent % выше нормы"
    } else {
        "Все ок. Не превышает $ThresholdPercent"
    }


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram



    • Изменено Sergey Korotkov 18 декабря 2019 г. 13:49
    • Помечено в качестве ответа ReMCatcheR 18 декабря 2019 г. 13:54
    18 декабря 2019 г. 13:45

Все ответы

  • дефолтовые значения у start-sleep миллисекунды

    задачу я не понял


    The opinion expressed by me is not an official position of Microsoft

    18 декабря 2019 г. 13:14
    Модератор
  • Тогда скажу проще.

    $arr1 = @(71,85,36,91,99,89,83,65,31,44)

    $arr2 = @(80..100)

    Как сравнить эти 2 массива на совпадение хотя бы 50% (в идеале 50% и больше) элементов от массива $arr1


    • Изменено ReMCatcheR 18 декабря 2019 г. 13:22
    18 декабря 2019 г. 13:18
  • Тогда скажу проще.

    $arr1 = @(71,85,36,91,99,89,83,65,31,44)

    $arr2 = @(80..100)

    Как сравнить эти 2 массива на совпадение хотя бы 50% (в идеале 50% и больше) элементов от массива $arr1


    фрагмент выделенный жирным подчеркнутым курсивом в мою голову не влазит

    сравить массивы просто

    $ar1 | where {$_ in $ar2}

    или через compare-object но потом нужно будет играться со стрелками


    The opinion expressed by me is not an official position of Microsoft

    18 декабря 2019 г. 13:30
    Модератор
  • $ar1 | where {$_ -in $ar2} - такой формат просто выводит значения которые совпали.

    НО это не совсем то что нужно. Грубо говоря:

    $arr1 = @(71,85,36,91,99,89,83,65,31,44)

    $arr2 = @(80..100)

    из этих двух массивов, явно совпадают 5 элементов (85,91,99,89,83) то бишь 50% от массива $arr1, остальные не попадают в диапазон массива $arr2. Мне нужно получить результат  $true или $false, т.е. если $false то отбой, если $true (50% и больше) то выполняем действие.

    18 декабря 2019 г. 13:44
  • Тогда скажу проще.

    $arr1 = @(71,85,36,91,99,89,83,65,31,44)

    $arr2 = @(80..100)

    Как сравнить эти 2 массива на совпадение хотя бы 50% (в идеале 50% и больше) элементов от массива $arr1


    $arr1 = @(71,85,36,91,99,89,83,65,31,44,88)

    $ThresholdPercent = 50

    $persent = ($arr1 | ? { $_ -ge 80 -and $_ -le 100 }).Count * 100 / $arr1.Count

    if ($persent -ge $ThresholdPercent ) { 
        Write-Host -ForegroundColor red "Алярм! Больше $ThresholdPercent % выше нормы"
    } else {
        "Все ок. Не превышает $ThresholdPercent"
    }


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram



    • Изменено Sergey Korotkov 18 декабря 2019 г. 13:49
    • Помечено в качестве ответа ReMCatcheR 18 декабря 2019 г. 13:54
    18 декабря 2019 г. 13:45
  • Точно, обычная формула вычисления процентов ))). Спасибо, то что нужно!
    18 декабря 2019 г. 13:54
  • $($arr1 -ge 80).count/$arr1.count -gt 0.5

    проценты, 100, сравнение массивов(???), уайл вместо фор - это все тараканы у вопрошающего резвятся.

    да условно можно было даже без массивов, деления и каунтов обойтись...

    снимаем значение с процов - если больше 80 тогда к переменной $cpus добавляем единичку, если нет вычитаем, в итоге смотрим - переменная меньше ноля - все ок, иначе триггер... а все остальное - от лукавого :-)

    18 декабря 2019 г. 21:17