有没有办法在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"}}
上述声明不起作用,那么请就如何去做有什么建议吗?
3条答案
按热度按时间jvlzgdj91#
你想用这个:
或者这个:
这真的是你所能得到的最简单的东西了,布尔运算符通常只应该用来组合比较运算符(或者其他你知道的表示布尔值的东西)。
您的代码:
这基本上是无意义的。它总是会求值为true。
{"USER1" -or "USER2" -or "USER3"}
的数据类型是ScriptBlock。我相信PowerShell会将其转换为字符串,但即使它被转换为字符串,它仍然不会作为布尔表达式进行计算:
除非用户是字面上的"USER1"或"USER2"或"USER3",否则将计算为True
如果将其更改为括号表达式而不是脚本块:
那么它将始终为true。
("USER1" -or "USER2" -or "USER3")
是布尔类型,并且将始终具有true值。所以你基本上是在运行:
同样,即使PowerShell像我想的那样将所有内容转换为字符串,您也不太可能有一个名为"True"的用户,所以这将永远是真的。
o7jaxewo2#
假设你处理一个数组,它可以用类似于你写它的方式来完成,甚至更短,看看这个:
yfwxisqw3#
关于比较运算符/通用功能
当运算符的输入是标量值时,运算符返回布尔值。当输入是集合时,运算符返回集合中与表达式右侧值匹配的元素。如果集合中没有匹配项,比较运算符将返回空数组。例如: