如果你想要一套或另外一组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复制它)
答案 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 }