powershell 合并多个逻辑运算符

omvjsjqw  于 2023-03-02  发布在  Shell
关注(0)|答案(3)|浏览(194)

有没有办法在where语句中合并多个逻辑运算符的参数?
基本上我有这样一个说法:

<command chain> | where {$_.user.tostring() -ne "USER1" -and $_.user.tostring() -ne "USER2" -and $_.user.tostring() -ne "USER3"}

这实际上是一个相当长的链条,所以我想把它简化成这样:

<command chain> | where {$_.user.tostring() -ne {"USER1" -or "USER2" -or "USER3"}}

上述声明不起作用,那么请就如何去做有什么建议吗?

jvlzgdj9

jvlzgdj91#

你想用这个:

where {$_.user.tostring() -notin ("USER1","USER2","USER3")}

或者这个:

where {($_.user.tostring() -ne "USER1") -and ($_.user.tostring() -ne "USER2") -and ($_.user.tostring() -ne "USER3") }

这真的是你所能得到的最简单的东西了,布尔运算符通常只应该用来组合比较运算符(或者其他你知道的表示布尔值的东西)。
您的代码:

where {$_.user.tostring() -ne {"USER1" -or "USER2" -or "USER3"}}

这基本上是无意义的。它总是会求值为true。{"USER1" -or "USER2" -or "USER3"}的数据类型是ScriptBlock。

PS C:\> ({"USER1" -or "USER2" -or "USER3"}).GetType().FullName
System.Management.Automation.ScriptBlock

我相信PowerShell会将其转换为字符串,但即使它被转换为字符串,它仍然不会作为布尔表达式进行计算:

PS C:> ({"USER1" -or "USER2" -or "USER3"}).ToString()
"USER1" -or "USER2" -or "USER3"

除非用户是字面上的"USER1"或"USER2"或"USER3",否则将计算为True
如果将其更改为括号表达式而不是脚本块:

where {$_.user.tostring() -ne ("USER1" -or "USER2" -or "USER3")}

那么它将始终为true。("USER1" -or "USER2" -or "USER3")是布尔类型,并且将始终具有true值。

PS C:\> ("USER1" -or "USER2" -or "USER3")
True

所以你基本上是在运行:

where {$_.user.tostring() -ne $true }

同样,即使PowerShell像我想的那样将所有内容转换为字符串,您也不太可能有一个名为"True"的用户,所以这将永远是真的。

o7jaxewo

o7jaxewo2#

假设你处理一个数组,它可以用类似于你写它的方式来完成,甚至更短,看看这个:

PS Z:\> @("food","drink","cheese","dog") -match "(food|cheese)"
food
cheese

PS Z:\> @("food","drink","cheese","dog") -notmatch "(food|cheese)"
drink
dog

where clause:

PS Z:\> @("food","drink","cheese","dog") | where {$_ -notmatch "(food|cheese)"}
drink
dog
yfwxisqw

yfwxisqw3#

关于比较运算符/通用功能

当运算符的输入是标量值时,运算符返回布尔值。当输入是集合时,运算符返回集合中与表达式右侧值匹配的元素。如果集合中没有匹配项,比较运算符将返回空数组。例如:

<command chain> | where {"USER1", "USER2", "USER3" -ne $_.user.tostring()}

相关问题