Есть ли способ найти условие в операторе if в powershell? - PullRequest
1 голос
/ 14 марта 2019

У меня есть несколько проверок в условии if, и если какой-либо из них терпит неудачу, состояние должно быть отказано. Для этого у меня теперь есть несколько операторов if, сравнивающих каждое значение с чем-то, чтобы скрипт мог уведомить, что именно не удалось. Есть ли способ, которым я могу поместить эти условия в условия и в условии if и определить, какое совпадение не удалось

if ($a -eq "apple")
{
    Write-Host "My fruit is apple"
}
else
{
    Write-Host "My fruit is not apple"
}
if ($b -eq "banana")
{
    Write-Host "My fruit is banana"
}
else
{
    Write-Host "My fruit is not banana"
}

Если я хочу свести к минимуму заявления, я могу написать

if (($b -eq "banana") -and ($a -eq "apple"))
{
    Write-Host "My fruit is banana and apple"
}
else
{
    Write-Host "Match failed for $a or $b"
}

В этом случае, если $ b является бананом, но $ a не яблоком, он войдет в другую часть, но как мне сказать, что $ a не соответствует. Мне нужно знать только критерии, которые не удовлетворены

Ответы [ 3 ]

3 голосов
/ 14 марта 2019

Битовая маска для фруктов должна работать хорошо. Пример такой:

# Fruit values are such that each will toggle its own bits.
[flags()] Enum Fruits {
  Apple  = 0x01
  Banana = 0x02
  Pear   = 0x04
  Orange = 0x08
  Pomelo = 0x10
  Melon  = 0x20
}

# Add some fruits into a basket    
$basket = [fruits]'apple'+[fruits]'banana'

# Check contents    
[fruits].GetEnumNames() | % {
    "$_ in basket? " $basket.HasFlag([fruits]::$_)
}
Apple in basket?  True
Banana in basket?  False
Pear in basket?  True
Orange in basket?  False
Pomelo in basket?  False
Melon in basket?  False

# Fill basket with sum of fruits:    
$basket = [fruits]17

[fruits].GetEnumNames() | % {
    "$_ in basket? " $basket.HasFlag([fruits]::$_)
}
Apple in basket?  True
Banana in basket?  False
Pear in basket?  False
Orange in basket?  False
Pomelo in basket?  True
Melon in basket?  False

# Remove an apple
$basket -= [fruits]'apple'
$basket
Pomelo

$basket.value__ будет больше нуля, если есть фрукты.

Дополнительная информация представлена ​​в двух статьях .

1 голос
/ 15 марта 2019

Учитывая, что ваши значения представлены в различных переменных $a и $b (концептуально, массив значений), switch оператор - ваша лучшая ставка:

# Sample values that are valid
$a = 'banana'
$b = 'apple'

# Collect the values to check in an array.
# (You could pass `$a, $b` directly to `switch` as well.)
$valuesToCheck = $a, $b

switch ($valuesToCheck) {
  'apple'  { 'My fruit is an apple.'; continue }
  'banana' { 'My fruit is a banana.'; continue }
  default  { Write-Warning "'$_' is not a known fruit." } 
}

Вышеуказанные выходы:

My fruit is a banana.
My fruit is an apple.

Если вы изменили, например, $b на недопустимое значение, например, $b = 'spinach', вы получите:

My fruit is a banana.
WARNING: 'spinach' is not a known fruit.
0 голосов
/ 14 марта 2019

Не могли бы вы использовать хеш-таблицы?

Посмотрите на эту статью: https://social.technet.microsoft.com/Forums/ie/en-US/7064dc22-0611-4f4c-a846-dc24ed344389/comparing-hashtables?forum=winserverpowershell

Создайте две хеш-таблицы и сравните их.Вы можете добавить больше ключей и значений без изменения кода.

Hash1 будет вашим шаблоном со всеми правильными значениями, а Hash2 вы используете все значения, которые вы хотите проверить.

$Results = @()
$hash1 = @{"test1"="123";"test2"="abcd";"test3"="xyz"}
$hash2 = @{"test1"="123";"test2"="cdey";"test3"="xyz";"test4"="pdqy"}
$hash1.keys | %{
    if ($hash2.keys -match $_){
        if (!($hash2.$_ -match $hash1.$_)) {
            $Results += new-object psobject -property @{Hash="Hash1";Key=$_;Value=$hash1.$_}
        }
    } Else {$Results += new-object psobject -property @{Hash="Hash1";Key=$_;Value=$hash1.$_}}
}
$hash2.keys | %{
    if ($hash1.keys -match $_){
        if (!($hash1.$_ -match $hash2.$_)) {
            $Results += new-object psobject -property @{Hash="Hash2";Key=$_;Value=$hash2.$_}
        }
    } Else {$Results += new-object psobject -property @{Hash="Hash2";Key=$_;Value=$hash2.$_}}
}
$Results | select Hash,Key,Value | sort -property Key,Hash | FT

Простойобъяснение того, как хэш-таблицы работают в powershell https://www.tutorialspoint.com/powershell/powershell_hashtables.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...