web-dev-qa-db-fra.com

combiner plusieurs conditions dans l'instruction if

Comment enchaînez-vous 4 conditions ensemble lorsque vous voulez que UN ensemble ou l'AUTRE ensemble de 2 conditions soit vrai?

Pour être plus précis, je veux faire:

Si l'utilisateur est connecté ET que la version du système d'exploitation est Windows 10

OR

L'utilisateur est connecté ET le processus LogonUI n'est pas en cours d'exécution

Ne vous embêtez pas avec les commandes, elles fonctionnent toutes correctement lorsqu'elles sont isolées, mon problème est de les enchaîner.

Par exemple, j'ai:

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

qui fonctionne bien. Je veux ajouter dans ce même if l'autre bloc de conditions. J'ai essayé ça, mais ça ne marche pas:

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 }

Comment enchaînez-vous plusieurs "blocs" comme celui-ci? Je sais que je pourrais faire deux FI différentes, je l'ai fait fonctionner mais n'y a-t-il pas un moyen de tout enchaîner dans une seule FI? (l'IF contient beaucoup de code et je ne veux pas le dupliquer avec deux IF)

5
Rakha

Mettez chaque ensemble de conditions entre parenthèses:

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

Si soit le premier o le deuxième ensemble de conditions doit être vrai (mais pas les deux) utilisez -xor au lieu de -or:

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

Remplacez A, B, C et D par les expressions respectives.

8
Ansgar Wiechers

Si vous souhaitez rendre le code dans votre propre réponse plus facile à comprendre, vous pouvez supprimer le code en double pour rendre l'instruction if plus propre.

Affecter les résultats aux variables et les utiliser à la place:

$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

Alors soit:

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

Ou

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

Donc, après avoir essayé quelques choses, il semble qu'il existe deux méthodes:

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 }

ou en utilisant l'excellente réponse d'Ansgar Wiechers pour enchaîner le tout en un seul 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 }
0
Rakha