powershell过滤对象并返回完全匹配

时间:2017-08-03 17:10:24

标签: powershell match where

我有$ variables和$ Array1

$ Array1包含:

FirstName  LastName   ZipCode                          Race

Alice      Jones      {90011, 90017, 90006}            American Indian, Asian, Hispanic 
Allen      Rogers     {90025, 90001}                   African American, American
John       Smith      {90001}                          American
Bob        Wilson     {90025, 90001, 90055, 90084}     African American, American,...
Barbara    Hall       {90025}                          White

我想遍历$ Array1并检查$ Variable是否在ZipCode中。 如果它匹配,那么做一些东西。

我拥有的是

foreach ($variable in $Variables) {
    $result=$Array1 | Where {$_.ZipCode -match "$variable$"}
} 

由于某种原因,它返回

Allen      Rogers     {90025, 90001}                   African American, American
John       Smith      {90001}                          American 
Bob        Wilson     {90025, 90001, 90055, 90084}     African American, American,...

我希望完全匹配。 输出应该是:

John       Smith      {90001}                          American 

我试过像

这样的正则表达式
$_.ZipCode -match "^$variable$"

但它没有用。

2 个答案:

答案 0 :(得分:1)

您需要使用-ceq进行完全匹配。这也是区分大小写的匹配。 -match / -cmatch使用正则表达式匹配模式

然而,要使用的更好的比较运算符是-contains

Where-Object { $_.ZipCode -contains "$variable" }

确保两种比较都匹配类型。如果您的数组使用[Int],请确保您与[Int]对象进行比较。这可以在PSv3 +中进一步简化:

? ZipCode -contains $variable

编辑OP:

| Where-Object { ($_.ZipCode.Count -eq 1) -and ($_.ZipCode -eq $variable) }

答案 1 :(得分:0)

您可以修改

$_.ZipCode -match "^$variable$" 

$_.ZipCode -match ("^"+$variable+"$") 

它将根据需要评估正则表达式。