web-dev-qa-db-ja.com

ifステートメントで複数の条件を組み合わせる

1つのセットまたは2つの条件のその他のセットのいずれかをtrueにしたい場合、どのように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 }

このように複数の「ブロック」をどのように連鎖させますか? 2つの異なるIFを実行できることはわかっていますが、それを機能させましたが、すべてを1つのIFにチェーンする方法はありませんか? (IFには多くのコードが含まれており、2つのIFでそれを複製したくありません)

5
Rakha

条件の各セットを括弧で囲みます。

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

どちらか最初のorの場合、2番目の条件セットはtrueでなければなりません(両方ではありません)-xorではなく-orを使用します。

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

A、B、C、およびDをそれぞれの式に置き換えます。

8
Ansgar Wiechers

自分の答えのコードを理解しやすくしたい場合は、重複するコードを削除して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"}
1
James C.

したがって、いくつかのことを試した後、2つの方法があるようです。

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の優れた答えを使用して、すべてを1つの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