Логические операторы Powershell

Я хочу создать логический сценарий, который предупреждает, когда для определенных сертификатов установлен срок действия см. пример электронной таблицы.

Я смотрел предупреждения на срок более 90 дней, от 89 до 61 дня, от 60 до 31 дня и менее 30 дней. Многословие предупреждений сейчас не вызывает большого беспокойства.

Я понимаю, что мне понадобится больше, но ищу помощь в этой логике elseif. Я ценю помощь, ребята!

$Alert = 'TakeAction'

  If ($Alert  -gt '90')  {

       Write-Host "Licenses or Certificate are fine"

  }  ElseIf ($Alert  -lt '89' -AND -gt'61')  {

       Write-Host "Please contact Vendor for updated Licenses or Certificate information"

  }  ElseIf ($Alert  -lt '60' -AND -gt'31')  {

       Write-Host "Action must be taken to update Licenses or Certificate from Vendor"

  }  

}  ElseIf ($Alert  -lt '30' -AND -gt'1')  {

       Write-Host "Immediate action must be taken for renewal of Licenses or Certificate!"

  }  

Else {

       Write-Host "Certificate Information N/A"

} 

1) Что такое логический сценарий? Вы имеете в виду «сценарий, использующий логические операторы»? 2) Почему вы цитируете свои цифры? Это заставит PowerShell сравнивать их как строки, а не числа. Это ваше намерение (и если да, то почему)?

Bill_Stewart 01.05.2018 21:16

@Bill_Stewart PowerShell сравнивает на основе типа левого объекта, верно? Итак, если $Alert - это [int32], он попытается преобразовать их в числа, не так ли?

TheMadTechnician 01.05.2018 21:22

Да, но 1) $Alert содержит строку в коде OP и 2) зачем добавлять ненужные кавычки?

Bill_Stewart 01.05.2018 21:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
1 602
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это тот случай, когда хорошо работает команда Switch. Он проверяет случай, и, если он истинен, выполнит связанный блок сценария. Когда команда Continue используется в этом блоке сценариев, она пропускает остальные случаи для повторного тестирования.

Switch ($Alert){
  { $_ -gt 90}  {

       Write-Host "Licenses or Certificate are fine"
       Continue

  }
  { $_ -gt 61}  {

       Write-Host "Please contact Vendor for updated Licenses or Certificate information"
       Continue

  }  
  { $_ -gt 31 }  {

       Write-Host "Action must be taken to update Licenses or Certificate from Vendor"
       Continue

  }  
  { $_ -gt 1 }  {

       Write-Host "Immediate action must be taken for renewal of Licenses or Certificate!"
       Continue
  }  

    Default {

       Write-Host "Certificate Information N/A"
  }
} 

switch - лучший выбор для нескольких условий. Если вам нужны предупреждения, я обычно использую Send-MailMessage для получения предупреждений. Это установит [boolean]$sendMail = $true, чтобы оценить, нужно ли отправлять электронное письмо (уведомление) или нет.

$certificateAge # = however you are getting your cert age
[boolean]$sendMail = $false
$message = @()
switch($certificateAge){
    {$_ -gt 90} 
    {
        $message = "Licenses or Certificate are fine"        
    }
    {$_ -lt 89 -and $_ -gt 61 } 
    {
        $message = "Please contact Vendor for updated Licenses or Certificate information"
        $sendMail = $true
    }
    {$_ -lt 60 -and $_ -gt 31 } 
    {
        $message = "Action must be taken to update Licenses or Certificate from Vendor"
        $sendMail = $true
    }
    {$_ -lt 30 -and $_ -gt 1 } 
    {
        $message = "Immediate action must be taken for renewal of Licenses or Certificate!"
        $sendMail = $true
    }    
    default{$message = "Certificate Information N/A"}
}


if ($sendMail)
{
    Send-MailMessage -From [email protected] -To [email protected] -SmtpServer mail.mail.com -Subject "Certificate information" -Body $message
}
($Alert -lt '89' -AND -gt '61')

Вы не можете так комбинировать операторы. У вас должны быть операнды с обеих сторон выражения.

Попробуй это:

If ($Alert -gt '90') {
    Write-Host "Licenses or Certificate are fine"
}
ElseIf ($Alert -lt '89' -AND $Alert -gt '61') {
    Write-Host "Please contact Vendor for updated Licenses or Certificate information"
}
ElseIf ($Alert -lt '60' -AND $Alert -gt '31') {
    Write-Host "Action must be taken to update Licenses or Certificate from Vendor"
}
ElseIf ($Alert -lt '30' -AND $Alert -gt '1') {
    Write-Host "Immediate action must be taken for renewal of Licenses or Certificate!"
Else {
    Write-Host "Certificate Information N/A"
} 

Обратите внимание, что вы используете больше (-gt) и меньше (-lt), но не больше или равно (-ge) или меньше или равно (-le). Это похоже на возможную ошибку.

Подобно TheMadTechnician, но более точно определяет диапазоны.

0..95|%{
    $Alert = $_
    switch ($Alert) {
        {1..30  -contains $_}   {"$_ Immediate action must be taken for renewal of Licenses or Certificate!" ;break}
        {31..60 -contains $_}   {"$_ Action must be taken to update Licenses or Certificate from Vendor" ;break}
        {61..90 -contains $_}   {"$_ Please contact Vendor for updated Licenses or Certificate information" ;break}
        {$_ -gt 90}             {"$_ Licenses or Certificate are fine" ;break}
        Default                 {"$_ Certificate Information N/A"}
    }
}

Я бы не рекомендовал этот подход, т.к. оператор -contains значительно медленнее, чем простое сравнение -gt.

Ansgar Wiechers 01.05.2018 23:55

@AnsgarWiechers Спасибо за подсказку, это относится и к -in?

user6811411 01.05.2018 23:59

Да. Оба выполняют линейный поиск по списку.

Ansgar Wiechers 02.05.2018 00:00

Другие вопросы по теме