在if语句中组合多个条件

时间:2018-05-02 12:08:04

标签: powershell if-statement boolean-logic

如果你想要一套或另外一组2个条件是真的,你如何将4个条件链接在一起?

更确切地说,我想这样做:

如果用户已登录且操作系统版本为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中吗? (IF包含大量代码,我不想用两个IF复制它)

3 个答案:

答案 0 :(得分:2)

将每组条件放在括号中:

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

如果 第一个第二组条件必须为true(但不是两个条件),请使用-xor代替-or

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

用相应的表达式替换A,B,C和D.

答案 1 :(得分:1)

如果您想让自己的答案中的代码更容易理解,可以删除重复的代码,使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"}

答案 2 :(得分:0)

所以在尝试了几件事之后,似乎有两种方法:

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 }

或使用Ansgar Wiechers的优秀答案将其全部链接在一个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 }