Powershell嵌套的Foreach循环提供了不正确的结果

Powershell嵌套的Foreach循环提供了不正确的结果,powershell,foreach,Powershell,Foreach,在我编写的脚本中,我已经用userid填充了两个数组$newUsers和$oldUsers。我的下一个目标是检查$newUsers中的userid是否存在于$oldUsers中。如果是,则显示语句Write Host“New User_id$rowNew found in Old User list”否则显示Write Host“New User_id$rowNew NOTFUND in Old User list” 下面是我使用的逻辑和我得到的输出 foreach ($rowNew in $n

在我编写的脚本中,我已经用userid填充了两个数组$newUsers和$oldUsers。我的下一个目标是检查$newUsers中的userid是否存在于$oldUsers中。如果是,则显示语句Write Host“New User_id$rowNew found in Old User list”否则显示Write Host“New User_id$rowNew NOTFUND in Old User list”

下面是我使用的逻辑和我得到的输出

foreach ($rowNew in $newusers){ 
           foreach ($rowOld in $oldusers){
                 if ($rowNew -ieq $rowOld){ 
                      Write-Host "New User_id $rowNew found in Old user list"
                 } else {
                   Write-Host "New User_id $rowNew Notfound in Old user list"   
                 }
            }
        }
--结果


不知道为什么我会得到上面的结果,我应该为每个用户ID得到一个结果吗。有谁能帮助我在上面的代码片段中需要更改什么吗?

我认为问题在于您试图将一个文件中的每个项目与另一个文件中的每个其他项目进行匹配,因此每次运行外部循环都会导致一个可能的大量不匹配

为什么不这样使用比较对象呢:

Compare-Object -ReferenceObject $oldusers -DifferenceObject $newusers -IncludeEqual | % {
  if($_.SideIndicator -eq '==') {$f = 'found'} else {$f = 'NotFound'}
  if($_.SideIndicator -eq '<=') {$a = 'Old'} 
  if($_.SideIndicator -eq '=>') {$a = 'New'}
  "New User_id $($_.InputObject) $f in $a user list"
}
Compare Object-ReferenceObject$oldusers-DifferenceObject$newusers-IncludeEqual |%{
if($\.SideIndicator-eq'='){$f='found'}其他{$f='NotFound'}
如果($\ SideIndicator-eq“”){$a='New'}
“新用户\u id$($\u.InputObject)$f在$a用户列表中”
}

另一种选择是只执行一个循环并使用-contains而不是-ieq。

我建议使用
compare-object
cmdlet。谢谢Dave!!为了进一步分析脚本中的这些userid,在foreach对象循环中,如何将找到的userid分配到一个数组中,而将未找到的userid分配到另一个数组中?我尝试使用-contains来使用一个循环,结果发现没有找到userid,下面是代码片段foreach($newUsers中的id){如果($id-包含$oldUsers){写入主机“$id在新用户列表中找到”}否则{写入主机“$id在新用户列表中找不到”}看起来不错,但您只需要做一个更改:$id-包含$oldUsers应该是$oldUsers-包含$id
Compare-Object -ReferenceObject $oldusers -DifferenceObject $newusers -IncludeEqual | % {
  if($_.SideIndicator -eq '==') {$f = 'found'} else {$f = 'NotFound'}
  if($_.SideIndicator -eq '<=') {$a = 'Old'} 
  if($_.SideIndicator -eq '=>') {$a = 'New'}
  "New User_id $($_.InputObject) $f in $a user list"
}