powershell - 组合多个逻辑运算符

标签 powershell powershell-4.0

有没有办法在 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/

相关文章:

Powershell 命名管道安全性?

powershell - Pester PowerShell测试提示多次输入

powershell - 为什么powershell远程设置COM+应用的 'QueuingEnabled'会导致保存失败?

powershell - 如何捕获变量而不是日志文件中的输出?

powershell - 如何从PS输出中过滤出特定值

c# - 定义自定义 Powershell 对象

powershell - 发送请求时在 PowerShell 中使用括号

powershell函数输出到变量

powershell - 退出行为与Exit-PSSession不同

powershell-4.0 - 如何从powershell提示中删除 "username@host"?