combine multiple conditions in if-statement combine multiple conditions in if-statement powershell powershell

combine multiple conditions in if-statement


Put each set of conditions in parentheses:

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

If either the first or the second set of conditions must be true (but not both of them) use -xor instead of -or:

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

Replace A, B, C, and D with the respective expressions.


If you want to make the code in your own answer easier to understand you can remove the duplicate code to make the if statement cleaner.

Assigning the results to variables and using those instead:

$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

Then either:

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

Or

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


So after trying a few things, it seems there are two methods:

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 }

or using Ansgar Wiechers's excellent answer to chain it all in one 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 }