有没有办法在where语句中组合多个逻辑运算符的参数?
基本上我有这样的陈述:
$('#button').click(function () {
buttonclick();
})
function buttonclick(){
var text = $('#text').val();
var li;
li = $('<li>' + text + '</li>');
$("#ul").append(li);
}
它实际上是一个相当长的链,所以我想简化它,使它变成这样:
<command chain> | where {$_.user.tostring() -ne "USER1" -and $_.user.tostring() -ne "USER2" -and $_.user.tostring() -ne "USER3"}
以上陈述不起作用,所以有任何建议请讨论如何解决这个问题吗?
答案 0 :(得分:3)
你想用这个:
where {$_.user.tostring() -notin ("USER1","USER2","USER3")}
或者这个:
where {($_.user.tostring() -ne "USER1") -and ($_.user.tostring() -ne "USER2") -and ($_.user.tostring() -ne "USER3") }
这真的很简单,你可以得到。一般来说,布尔运算符只能用于组合比较运算符(或其他你知道代表布尔值的东西)。
您的代码在这里:
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会将它转换为字符串,但即使它被转换为字符串,它仍然不会被评估为布尔表达式:
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”的用户。所以这将永远是真的。
答案 1 :(得分:0)
假设你处理一个数组,它可以用你编写的类似方式完成,甚至更短的检查:
PS Z:\> @("food","drink","cheese","dog") -match "(food|cheese)"
food
cheese
PS Z:\> @("food","drink","cheese","dog") -notmatch "(food|cheese)"
drink
dog
where clause:
PS Z:\> @("food","drink","cheese","dog") | where {$_ -notmatch "(food|cheese)"}
drink
dog