在Powershell的WHERE子句中添加多个-and和-or语句

时间:2019-06-14 21:04:06

标签: powershell

我目前正在使用Powershell,并且试图对从另一个系统提取的变量中的数据进行排序。目前,我正在尝试在-eq符号后使用一个-and语句和-or语句。因此,我想知道在where语句中使用语法的正确方法是什么。

$DLPList | Select Node.NodeName, Properties.OSType, PropsView.version, Node.NodeTextPath2 | where PropsView.version -ne '1.4.706.172' -and (Properties.OSType -eq $win7 -or $win8 -or $win81 -or $win10)

我知道在此还有很多其他的东西,但是到目前为止我尝试过的所有方法都不起作用。感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

是的,您必须使用where-object的脚本块版本。还要注意-and和-or在powershell中具有EQUAL PRECEDENCE,这在一种语言中是很不常见的。

答案 1 :(得分:0)

好的,我为此发现的是,您不能仅添加use -or。相反,您必须对每个属性执行Properties.ostype。这是我想出的代码来使其工作。还有一点提示是在Select-Object之前先执行Where-Object以节省计算能力。

$DLPList = $list1 | Where-Object{ $_.'UDLP.prodversion' -lt '9.5.704.112' -and ($_.'Properties.OSType' -ne 'Windows XP') -and ($_.'EPOComputerProperties.OSType' -ne 'Windows Vista') -and ($_.'EPOComputerProperties.OSType' -ne 'Windows 2003') -and ($_.'Properties.OSType' -ne 'Windows 2003 R2') -and ($_.'EPOComputerProperties.OSType' -ne 'Windows 2008') -and ($_.'Properties.OSType' -ne 'Windows 2008 R2') -and ($_.'Properties.OSType' -ne 'Windows Server 2012' -and ($_.'Properties.OSType' -ne 'Windows Server 2012 R2') -and ($_.'Properties.OSType' -ne 'Windows Server 2016')) } | Select-Object Node.NodeName, Properties.OSType, UDLP.productversion, Node.NodeText | Sort-Object -Property Node.NodeText -Descending

答案 2 :(得分:-1)

尝试添加方括号,并使用正则表达式“ -match”运算符条件替换链接的布尔运算符:

$DLPList | Select Node.NodeName, Properties.OSType, PropsView.version, Node.NodeTextPath2 | where { $_.'PropsView.version' -ne '1.4.706.172' -and ($_.'Properties.OSType' -match "($win7|$win8|$win81|$win10)") }

以下适用于我的示例代码:

$DLPList = @(2, 4, 6, 7)
$DLPList | where { ($_ -ne 7) -and ($_ -lt 10) -and ($_ -gt 0) }
2
4
6

$DLPList | where { ($_ -ne 7) -and ($_ -match "(4|5|11)" -and ($_ -gt 0)) }
4