You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell if语句中组合多组复合条件(满足任一组双条件)

在PowerShell中链式组合多组条件的解决方案

嘿,这个需求其实很好实现,核心就是利用PowerShell的逻辑运算符-and和-or,再通过括号明确条件分组,就能精准实现你要的「两组二选一,每组内两个条件同时成立」的逻辑。

先理清楚你的需求逻辑

你要的是:

(用户已登录 且 系统是Windows 10) 或者 (用户已登录 且 LogonUI进程未运行)

优化后的完整代码示例

首先建议把重复的WMI查询存成变量,避免重复调用提升效率,同时让代码更易读:

# 定义目标计算机
$poste = "你的目标计算机名"

# 提前获取系统信息,避免重复查询
$computerSystem = Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem
$osInfo = Get-WmiObject -ComputerName $poste -Class Win32_OperatingSystem
# 检查LogonUI进程是否运行(不存在则返回null,用ErrorAction抑制错误)
$logonUIProcess = Get-Process -ComputerName $poste -Name LogonUI -ErrorAction SilentlyContinue

# 组合条件判断
if (
    # 第一组条件:已登录 + Win10
    ($computerSystem.UserName -and $osInfo.Version -like "*10*") -or
    # 第二组条件:已登录 + LogonUI未运行
    ($computerSystem.UserName -and (-not $logonUIProcess))
) {
    Write-Host "执行操作X"
    # 这里替换成你实际要执行的命令
}

更简洁的优化版本

因为两组条件都包含「用户已登录」这个前置条件,我们可以把它提取出来,让逻辑更紧凑:

if (
    $computerSystem.UserName -and 
    ($osInfo.Version -like "*10*" -or (-not $logonUIProcess))
) {
    Write-Host "执行操作X"
}

关键细节说明

  • 括号的重要性:PowerShell中-and的优先级高于-or,必须用括号把每组「同时成立」的条件括起来,否则逻辑会跑偏成「(已登录且Win10)或已登录」加上「LogonUI未运行」,完全不符合你的需求。
  • LogonUI进程的判断:用Get-Process查询时,加上-ErrorAction SilentlyContinue可以避免进程不存在时抛出错误;如果进程未运行,$logonUIProcess会是$null,用-not就能判断出「未运行」的状态。
  • 变量复用:把WMI查询结果存成变量,不仅减少了对目标计算机的远程调用次数,也让代码的可读性大大提升。

内容的提问来源于stack exchange,提问作者Rakha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:20:56