PowerShell中的数组减法

时间:2017-11-20 07:33:55

标签: linq powershell

我有一个对象数组:

$people= @()
foreach ($person in $databaseOfGuests)
{
   $people += @{ "FirstName"=$person.FirstName; "LastName"=$person.LastName } 
}

现在我想删除$people中的重复项,是否可以在PowerShell中执行此操作?类似的东西:

$people = $people | Select -Uniq

我有两个数组$people1$people2,我需要获取$people1但不在$people2中的所有人的数组,反之亦然。类似的东西:

$peopleInPeople1ButNotInPeople2 = $people1.Substruct($people2)
$peopleInPeople2ButNotInPeople1 = $people2.Substruct($people1)

是否可以在PS中的一行中完成?

3 个答案:

答案 0 :(得分:2)

试试这个:

$people1 | ? {$_ -notin $people2}

或者您可以按属性进行过滤,例如firstname或lastname:

$people1 | ? {$_.Firstname -notin $people2.Firstname}
  • -notin运算符在PS3及更高版本上可用,对于较低版本,您可以使用-notcontains

答案 1 :(得分:0)

我的第一个想法是回退到.NET Framework并使用LINQ。但事实证明,PowerShell语法非常难看:

[Linq.Enumerable]::Except([object[]] $people1, [object[]] $people2)

(我不确定为什么object[]强制转换是必要的,但如果没有它们,PowerShell会抛出“无法找到重载”除了“和参数count:”2“”异常。)

答案 2 :(得分:0)

惯用的PowerShell将是:

$people1 | Where-Object { $people2 -notcontains $_ }