Powershell-比较两个阵列返回错误的结果

Powershell-比较两个阵列返回错误的结果,powershell,powershell-2.0,Powershell,Powershell 2.0,我希望有人能帮助解决我在比较数组时遇到的问题 以下是一些背景资料。我有一个powershell脚本,它生成域控制器列表,检查它们是否在线,然后将数据写入csv文件。这个很好用 我想每周运行一次,并在添加或删除任何域控制器时发送警报 我有另一个脚本将以前生成的CSV导入到一个数组,然后我生成一个新的域控制器列表,并将该列表发送到一个新数组。我正在尝试使用compare object比较这两个对象,并导出一个新的CSV,其中包含一个差异列表 然而,我正在通过手动修改旧的CSV来测试这一点,我发现无论

我希望有人能帮助解决我在比较数组时遇到的问题

以下是一些背景资料。我有一个powershell脚本,它生成域控制器列表,检查它们是否在线,然后将数据写入csv文件。这个很好用

我想每周运行一次,并在添加或删除任何域控制器时发送警报

我有另一个脚本将以前生成的CSV导入到一个数组,然后我生成一个新的域控制器列表,并将该列表发送到一个新数组。我正在尝试使用compare object比较这两个对象,并导出一个新的CSV,其中包含一个差异列表

然而,我正在通过手动修改旧的CSV来测试这一点,我发现无论我从以前的列表中删除哪个域控制器,或者在哪里添加新的域控制器,它都会报告更改是列表中的最后一个域控制器

例如,我的CSV文件如下所示:

"DC_Name","Ping_Response"
"dc1.testcompany.com","online"
"dc2.testcompany.com","online"
"dc3.testcompany.com","online"
"dc4.testcompany.com","online"
如果我通过删除“dc3.testcompany.com”、“online”并再次运行脚本来测试这个问题,它知道列表已经更改,但它报告新条目是“dc4.testcompany.com”、“online”,而不是“dc3.testcompany.com”、“online”

类似地,如果我修改我的旧csv,使其如下所示:

"DC_Name","Ping_Response"
"dc1.testcompany.com","online"
"dc2.testcompany.com","online"
"dc5.testcompany.com","online"
"dc3.testcompany.com","online"
"dc4.testcompany.com","online"

它将报告不同于新列表的一个是“DC4.TestCopy.com”,“在线”,而不是我在中间添加的一个。

我的比较肯定有问题。以下是我正在使用的脚本的相关部分:

$newDCArray = @(Import-CSV DC_List.csv)

$oldDCArray = @(Import-CSV Last_DC_List.csv)

$diff = Compare-Object $oldDCArray $newDCArray

if($diff -eq $null)
    {
    Write-Host "No changes to DCs"
    }
else    
    {
    Write-Host "There have been changes to DCs"
    $diff| Export-CSV DC_Change_List.csv -notypeinformation
    Send-MailMessage –From "xxxx@xxxxxxxx.com" –To "xxxx@xxxxxxxx.com" –Subject "Alert - Domain Controllers Added or Removed" –Body "DC Report Attached" –SmtpServer "smtp.xxxxxxxxxxx.net" -Attachments "DC_Change_List.csv"
    }
如果有人有任何想法,请告诉我

谢谢大家!!
John

导入Csv所返回的对象不是您应该与之进行比较的“真实”对象。它们是动态生成的自定义对象。您会注意到,如果显式检查
$newDCArray[0]-eq$oldcarray[0]
,它将返回
$false
。由于根本不存在检查相等性的正确管道,
Compare Object
不可能正常工作

不过没关系<代码>比较对象有一个
-Property
参数,允许您查看给定对象的一个或多个特定属性。属性是真实对象(字符串),因此比较有效。在您的案例中,您对两个属性感兴趣—
DC\u Name
Ping\u Response
,因为您想知道服务器是否是新的/删除的,以及已知的服务器是否已脱机

这应该适合您:

Compare-Object $oldDCArray $newDCArray -Property 'DC_Name','Ping_Response'

另外,确保
-SyncWindow
足够大,以便比较准确。或者,有时在比较之前简单地对数组进行排序是最容易的,这样您就不必担心了。

下面是一个可接受答案的版本,它可以自动确定属性:

$newDCArray = Import-CSV DC_List.csv
$oldDCArray = Import-CSV Last_DC_List.csv

$propNew = ($newDCArray | Get-Member | ?{$_.MemberType -eq "NoteProperty" | Select -expand Name})
$propOld = ($oldDCArray | Get-Member | ?{$_.MemberType -eq "NoteProperty" | Select -expand Name})
$prop = ($propNew + $propOld) | Get-Unique

$diff = Compare-Object $oldDCArray $newDCArray -Property $prop

请注意,
Get Unique
stuff执行不同的联合,它仅在csv文件的列不同时才相关。否则,您可以使用任一对象的属性。

谢谢!-property参数正是我所缺少的,现在它工作得很好!