Лучший способ создать несколько операторов notlike if

Этот оператор if по какой-то причине не соответствует ничему, даже несмотря на то, что выходные данные в CSV содержат данные $MemberName в ячейке.

if($MemberName -notlike "Administrator" -or $MemberName -notlike "Domain Admins" -or $MemberName -notlike "Workstation Admin"){
                Add-Content -Path $OutPutFile -Value "$Computer, $LocalGroupName, SUCCESS, $MemberType, $MemberDomain, $MemberName"
            }

Также есть ли более эффективный способ написать оператор if? Я только хочу добавить строку, ЕСЛИ $MemberDomain и $MemberName НЕ СООТВЕТСТВУЮТ следующим наборам критериев:

$MemberDomain    $MemberName
LocalUser   AND  Administrator
DomainGroup AND  Workstation Admin
DomainGroup AND  Domain Admins

Что-то вроде:

if(($MemberName -notlike "Administrator" -and $MemberDomain -notlike "LocalUser") -or ($MemberName -notlike "Domain Admins" -and $MemberDomain -notlike "DomainGroup") -or ($MemberName -notlike "Workstation Admin" -and $MemberDomain -notlike "DomainGroup")) { do something }

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

$ExcludedNames = ("Administrator","Workstation Admin","Domain Admins")
$ExcludedMemberTypes = ("LocalUser","DomainGroup")

if(($ExcludedNames -contains $MemberName) -and ($ExcludedMemberTypes -contains $MemberType) ){
    } else {
    Add-Content -Path $OutPutFile -Value "$Computer, $LocalGroupName, SUCCESS, $MemberType, $MemberDomain, $MemberName"
    }

Проблемы, которые я хочу сопоставить, оба вместе. Например, комбинация «DomainGroup и Administrator» будет истинной для приведенного выше кода и должна быть ложной, если только LocalUser и Administrator должны быть истинными.


person Bradley Smith    schedule 13.05.2015    source источник


Ответы (1)


Если вам не нужно сопоставление с подстановочными знаками, вы можете использовать switch и -notcontains

$Success = switch($MemberDomain)
{
    "LocalUser" {"Administrator" -ne $MemberName}
    "DomainGroup" {"Workstation Admin","Domain Admins" -notcontains $MemberName}
}

if($Success){
    Add-Content # ...
}

В PowerShell 3.0 и более поздних версиях вы также можете использовать эквивалентный оператор -notin, который может быть немного более интуитивным:

$MemberName -notin "Workstation Admin","Domain Admins"
person Mathias R. Jessen    schedule 13.05.2015
comment
Интересно. Никогда не думал о переключении. Я должен буду прочитать об этом. - person Bradley Smith; 13.05.2015