объединить несколько условий в операторе if - PullRequest
0 голосов
/ 02 мая 2018

Как вы соединяете 4 условия вместе, когда хотите, чтобы либо ОДИН набор, либо ДРУГОЙ набор из 2 условий были истинными?

Чтобы быть более точным, я хочу сделать:

Если пользователь вошел в систему И версия операционной системы Windows 10

OR

Пользователь вошел в систему И процесс LogonUI не запущен

Не беспокойтесь о командах, они все работают правильно, когда изолированы, моя проблема - связывать их вместе.

Например, у меня есть:

if (
        (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName`
        -and`
        (Get-WmiObject -Computer $poste -Class Win32_OperatingSystem).Version -like "*10*"
    )
    { echo do X }

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

if (
        (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName`
        -and`
        (Get-WmiObject -Computer $poste -Class Win32_OperatingSystem).Version -like "*10*"`
        -or`
        (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName`
        -and -not`
        (Get-Process -ErrorAction SilentlyContinue -ComputerName $poste -name logonui)
    )
    { echo do X }

Как вы связываете несколько «блоков», как это? Я знаю, что мог бы сделать два разных ИФ, у меня все получилось, но разве нет способа объединить все это в один ИФ? (если IF содержит много кода, и я не хочу дублировать его с двумя IF)

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Положите каждый набор условий в скобки:

if ( (A -and B) -or (C -and D) ) {
    echo do X
}

Если или первый или , то второй набор условий должен быть истинным (но не оба из них), используйте -xor вместо -or:

if ( (A -and B) -xor (C -and D) ) {
    echo do X
}

Заменить A, B, C и D на соответствующие выражения.

0 голосов
/ 02 мая 2018

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

Присвоение результатов переменным и их использование вместо:

$UserName = Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem | select -ExpandProperty UserName
$WindowsVersion = Get-WmiObject -Computer $poste -Class Win32_OperatingSystem | select -ExpandProperty Version
$LogonuiProcess = Get-Process -name logonui -ComputerName $poste -ErrorAction SilentlyContinue

Тогда либо:

if (($UserName -and $WindowsVersion -like "*10*") -or ($UserName -and -not $LogonuiProcess)) {Write-Output "do X"}

Или

if ($UserName -and $WindowsVersion -like "*10*") {Write-Output "do X"}
elseif ($UserName -and -not $LogonuiProcess) {Write-Output "do Y"}
0 голосов
/ 02 мая 2018

Итак, после нескольких попыток, кажется, есть два метода:

if (
        (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName`
        -and`
        (Get-WmiObject -Computer $poste -Class Win32_OperatingSystem).Version -like "*10*"`

    ) { echo do X }

    elseif (

        (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName`
        -and -not`
        (Get-Process -ErrorAction SilentlyContinue -ComputerName $poste -name logonui)

    )   { echo do X }

или используя превосходный ответ Ансгара Вичерса, чтобы объединить все в один, если:

if (
        (      
        (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName`
        -and`
        (Get-WmiObject -Computer $poste -Class Win32_OperatingSystem).Version -like "*10*"`
        ) -or`
        (       
        (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName`
        -and -not`
        (Get-Process -ErrorAction SilentlyContinue -ComputerName $poste -name logonui)`
        )

    ) { echo do X }
...