组合多个逻辑运算符

时间:2015-09-28 02:50:17

标签: powershell powershell-v4.0

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

以上陈述不起作用,所以有任何建议请讨论如何解决这个问题吗?

2 个答案:

答案 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
相关问题