有没有办法在 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"}}
上述声明不起作用,所以请就如何解决这个问题提出任何建议?
最佳答案
你想使用这个:
where {$_.user.tostring() -notin ("USER1","USER2","USER3")}
或这个:
where {($_.user.tostring() -ne "USER1") -and ($_.user.tostring() -ne "USER2") -and ($_.user.tostring() -ne "USER3") }
这真的很简单。通常, bool 运算符应该仅用于组合比较运算符(或您知道的其他表示 bool 值的东西)。
你的代码在这里:
where {$_.user.tostring() -ne {"USER1" -or "USER2" -or "USER3"}}
这基本上是无稽之谈。它总是会评估为真。
{"USER1" -or "USER2" -or "USER3"}
是 ScriptBlock 数据类型。PS C:\> ({"USER1" -or "USER2" -or "USER3"}).GetType().FullName
System.Management.Automation.ScriptBlock
我相信 PowerShell 会将其转换为字符串,但即使将其转换为字符串,它仍然不会被评估为 bool 表达式:
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")}
那么它永远是真的。
("USER1" -or "USER2" -or "USER3")
是 Boolean 类型,并且始终具有 true 值。PS C:\> ("USER1" -or "USER2" -or "USER3")
True
所以你基本上是在运行:
where {$_.user.tostring() -ne $true }
同样,即使 PowerShell 像我认为的那样将所有内容转换为字符串,您也不太可能拥有名为“True”的用户。所以这将永远是真的。
关于powershell - 组合多个逻辑运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815045/