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でそれを複製したくありません)
条件の各セットを括弧で囲みます。
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をそれぞれの式に置き換えます。
自分の答えのコードを理解しやすくしたい場合は、重複するコードを削除して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つの方法があるようです。
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 }