组合多个逻辑运算符

d3X*_*t3r 6 powershell powershell-4.0

有没有办法在 where 语句中组合多个逻辑运算符的参数?

基本上我有这样的声明:

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

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

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

上述声明不起作用,所以请就如何解决这个问题提出任何建议?

Bac*_*its 8

你想使用这个:

where {$_.user.tostring() -notin ("USER1","USER2","USER3")}
Run Code Online (Sandbox Code Playgroud)

或这个:

where {($_.user.tostring() -ne "USER1") -and ($_.user.tostring() -ne "USER2") -and ($_.user.tostring() -ne "USER3") }
Run Code Online (Sandbox Code Playgroud)

这真的很简单。通常,布尔运算符应该仅用于组合比较运算符(或您知道的其他表示布尔值的东西)。


你的代码在这里:

where {$_.user.tostring() -ne {"USER1" -or "USER2" -or "USER3"}}
Run Code Online (Sandbox Code Playgroud)

这基本上是无稽之谈。它总是会评估为真。 {"USER1" -or "USER2" -or "USER3"}是 ScriptBlock 数据类型。

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

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

PS C:> ({"USER1" -or "USER2" -or "USER3"}).ToString()
"USER1" -or "USER2" -or "USER3"
Run Code Online (Sandbox Code Playgroud)

除非用户字面上是 '"USER1" - 或 "USER2" - 或 "USER3"',否则它将评估为 True

如果您将其更改为括号表达式而不是脚本块:

where {$_.user.tostring() -ne ("USER1" -or "USER2" -or "USER3")}
Run Code Online (Sandbox Code Playgroud)

那么它永远是真的。 ("USER1" -or "USER2" -or "USER3")是 Boolean 类型,并且始终具有 true 值。

PS C:\> ("USER1" -or "USER2" -or "USER3")
True
Run Code Online (Sandbox Code Playgroud)

所以你基本上是在运行:

where {$_.user.tostring() -ne $true }
Run Code Online (Sandbox Code Playgroud)

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