where子句中的多个条件

时间:2018-12-04 09:52:31

标签: powershell

当我执行以下代码时,出现以下错误:找不到与名称或匹配的参数。如何获取电子邮件地址中没有abc.com或xyz.com的用户列表?

Get-ADGroupMember -Identity "AQ" -Recursive | where objectClass -eq 'user' | Get-ADUser -Properties *,  "msDS-UserPasswordExpiryTimeComputed", PasswordNeverExpires |

where  mail -notmatch "@abc.com" -or "@xyz.com" | 
Select-Object @{Label = "SAM Account Name";Expression = {$_.SamAccountName}}

3 个答案:

答案 0 :(得分:4)

大括号(实际上是带有过滤器脚本的脚本块)不能总是用Where-Object跳过。

您可以执行Where-Object objectClass -eq 'user',但涉及多个操作符的所有事情都必须编写为过滤器脚本:

where {$_.mail -notmatch "@abc.com" -or "@xyz.com" }

现在,此逻辑不起作用,因为它等效于以下语句:

where {($_.mail -notmatch "@abc.com") -or $true }

因此,无论-notmatch操作的结果如何,您的where子句均为true。您需要两个-notmatch操作:

Where-Object - { $_.Mail -notmatch '@abc.com' -and $_.Mail -notmatch '@xyz.com' }

根据要在过滤器脚本中排除的电子邮件地址的数量,您可能希望使用其他方法:从电子邮件地址中删除用户名,然后查看该地址是否出现在电子邮件数组中您要排除的地址。

Where-Object { ( $_.Mail -replace '^[^@]+') -notin '@abc.com','@xyz.com','@foo.bar' }

答案 1 :(得分:2)

对于多种情况,请使用完整语法:

where-object { $_.property -eq $b -and $_.otherproperty -match $a }

答案 2 :(得分:1)

您在where-clause周围缺少括号:

where {objectClass -eq 'user'}

这:

where {mail -notmatch "@abc.com" -or  "@xyz.com"}

应该像这样:

where {mail -notmatch "@abc.com" -or mail -notmatch "@xyz.com"}

请重新考虑您的秒数逻辑,因为它永远都是正确的。