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)
上述声明不起作用,所以请就如何解决这个问题提出任何建议?
你想使用这个:
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”的用户。所以这将永远是真的。
| 归档时间: |
|
| 查看次数: |
12972 次 |
| 最近记录: |