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)
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.
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"}
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 }