Powershell - 比较两个数组返回错误的结果

标签 powershell powershell-2.0

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

这是一些背景。我有一个生成域 Controller 列表的 powershell 脚本,检查它们是否在线,然后将数据写入 csv 文件。这工作正常。

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

我有另一个脚本将先前生成的 CSV 导入到一个数组中,然后生成一个新的域 Controller 列表并将该列表发送到一个新数组。我正在尝试使用比较对象来比较两者,并导出一个带有差异列表的新 CSV。

但是,我正在通过手动修改旧的 CSV 进行测试,我发现无论我从上一个列表中删除哪个域 Controller 或在何处添加新的域 Controller ,它总是报告更改是最后一个域 Controller 在名单上。

例如,我的 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”,“在线”。

同样,如果我将旧的 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.testcompany.com”、“online”,而不是我在中间添加的那个。

我的比较一定是做错了什么。这是我正在使用的脚本的相关部分:
$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"
    }

如果有人有任何想法,请告诉我!

谢谢!
约翰

最佳答案

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

不过没关系。 Compare-Object有一个 -Property允许您查看给定对象的 1 个或多个特定属性的参数。属性是真实的对象(字符串),因此比较有效。在您的情况下,您对 2 处房产感兴趣 - DC_NamePing_Response ,因为您想知道服务器是否是新的/已删除,以及已知服务器是否已离线。

这应该适合你:

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

另外,请确保 -SyncWindow足够大,使得比较是准确的。或者有时在比较之前简单地对数组进行排序是最简单的,因此您无需担心。

关于Powershell - 比较两个数组返回错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12465819/

相关文章:

powershell - 在 Powershell 中重定向到 $null 奇怪的行为

process - powershell v2 - 如何获取进程 ID

ruby - 使用 Ruby/WinRM 从 Linux 运行 Exchange Powershell 命令

powershell - ASP.NET 5 MVC 6 : Publish-AzureWebsiteProject incorrect directory structure

powershell - 将 .Net 枚举导入 PowerShell 脚本

json - 如何在PowerShell中访问名称由星号组成的属性?

PowerShell 2.0 以及如何处理异常?

powershell - 标准输入到使用Invoke-Expression调用的命令

powershell - Powershell选择字符串列

powershell - 使用 Import-Excel 导入数字然后使用 PSObjects 作为数字的正确方法是什么?