Я хочу создать логический сценарий, который предупреждает, когда для определенных сертификатов установлен срок действия см. пример электронной таблицы.
Я смотрел предупреждения на срок более 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"
}
@Bill_Stewart PowerShell сравнивает на основе типа левого объекта, верно? Итак, если $Alert
- это [int32]
, он попытается преобразовать их в числа, не так ли?
Да, но 1) $Alert
содержит строку в коде OP и 2) зачем добавлять ненужные кавычки?
Это тот случай, когда хорошо работает команда 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
.
@AnsgarWiechers Спасибо за подсказку, это относится и к -in
?
Да. Оба выполняют линейный поиск по списку.
1) Что такое логический сценарий? Вы имеете в виду «сценарий, использующий логические операторы»? 2) Почему вы цитируете свои цифры? Это заставит PowerShell сравнивать их как строки, а не числа. Это ваше намерение (и если да, то почему)?