none
Powershell и сравнение двух результатов команд в переменных RRS feed

  • Вопрос

  • Добрый день.  Подскажите пожалуйста, как реализовать правильное сравнение.

    Цель: чтобы скрипт работал и обновлял логи поверх уже имеющихся если status "ОК". Если же статус отличается от "ОК", то он выводил логи в отдельный файл с дозаписыванием.  Что касается вывода логов тут понятно, не понятно как сделать правильную проверку. У меня всегда получается значение "else". 

    $r = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    
    $i = 1
    while  ($i -eq 1) {
    sleep 2
    "Скрипт работает. Проверка выполняется."
    Get-WmiObject Win32_VideoController | Select-Object Name, AdapterDACType, Status, AdapterRAM, VideoModeDescription, MaxRefreshRate, MinRefreshRate, DriverVersion, InstalledDisplayDrivers | ConvertTo-HTML -Head "<link rel='stylesheet' href='c:\styles.css' type='text/css' />" |
    Out-File c:\video.html #-Append
    $var = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    if ($var -eq $r) {123}
    else {"456"
    }}
    
    

Ответы

  • у вас и $r и $var это psCustomObject и проблема именно. Сравнение базовых типов работает корректно, обьектов так как вы видите

    решений несколько. Первое простое и очевидное использовать коммандлет сравнения Compare-Object

    $a = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    $b = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    $ComparisonResult = Compare-Object $a $b -Property Name, Status -IncludeEqual if ($ComparisonResult.SideIndicator -eq '=='){123} else{456}

    но это нормально будет работать если у вас видеоконтроллер 1 в противном случае по ним нужно будет итерировать

    Второй вариант это сравение конкретных параметров

    $a = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    $b = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    if (($a.Name -eq $b.Name) -and ($a.Status -eq $b.Status)){123} else{456}

    Но это так же будет нормально работать если $a и $b содержат по одному элементу, а не по массиву элементов


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

    • Изменено Vector BCOModerator 25 мая 2020 г. 14:20
    • Помечено в качестве ответа DailonWong 25 мая 2020 г. 15:41
    Модератор

Все ответы

  • у вас и $r и $var это psCustomObject и проблема именно. Сравнение базовых типов работает корректно, обьектов так как вы видите

    решений несколько. Первое простое и очевидное использовать коммандлет сравнения Compare-Object

    $a = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    $b = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    $ComparisonResult = Compare-Object $a $b -Property Name, Status -IncludeEqual if ($ComparisonResult.SideIndicator -eq '=='){123} else{456}

    но это нормально будет работать если у вас видеоконтроллер 1 в противном случае по ним нужно будет итерировать

    Второй вариант это сравение конкретных параметров

    $a = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    $b = Get-WmiObject Win32_VideoController | Select-Object Name, Status
    if (($a.Name -eq $b.Name) -and ($a.Status -eq $b.Status)){123} else{456}

    Но это так же будет нормально работать если $a и $b содержат по одному элементу, а не по массиву элементов


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

    • Изменено Vector BCOModerator 25 мая 2020 г. 14:20
    • Помечено в качестве ответа DailonWong 25 мая 2020 г. 15:41
    Модератор
  • 1 способ в тестовом режиме работает, если что можно отключить встроенную видеокарту, но хотелось бы конечно избежать этого. На счет итерировании по видеоконтроллерам не понял, как это сделать. 

    Если можете подсказать как это сделать, был бы признателен. 

  • 1 способ в тестовом режиме работает, если что можно отключить встроенную видеокарту, но хотелось бы конечно избежать этого. На счет итерировании по видеоконтроллерам не понял, как это сделать. 

    Если можете подсказать как это сделать, был бы признателен. 

    какую задачу решаете?

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

    Модератор
  • Задача следующая: мониторинг системы (в данном случаем hwinfo64) выдаёт всю нужную информацию о ПК, и если что-то выходит за рамки, заббикс об этом сообщает. Вопрос в том, что он не говорит, если видео драйвер был остановлен. 

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


  • не могли бы вы описать кейс, где это важно\нужно\критично?

    ----

    З.Ы. зойчем сдался драйвер и видюхи?


    • Изменено Svolotch 27 мая 2020 г. 23:20
    • Изменено Vector BCOModerator 28 мая 2020 г. 7:34 удалена часть сообщения
  • Извиняюсь за долгое отсутствие.

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

    Надо как-то это выявлять. Мониторить.

    Тесты видеокарт бесполезны. Спокойно проходятся. 

    Но например при переключении вкладок браузера может упасть видеодрайвер.


    17 июня 2020 г. 9:13