【问题标题】:Compare Two Objects Properties and Obtain Missing Items比较两个对象属性并获取缺失项
【发布时间】:2017-06-23 14:10:17
【问题描述】:

我正在尝试比较两个名为“name”的对象属性,它们包含相同类型的数据,在本例中为服务器主机名。对象不相同 AKA 不具有相同的属性。简而言之,我正在尝试比较两个服务器名称列表并确定它们从哪里(哪个对象)丢失。

我正在寻找每个对象中缺少的项目(服务器主机名)。当找到某些东西时,我希望在找到它的给定对象中获取该项目的所有相关属性。我可以成功地进行比较对象,但不知道如何获得我正在寻找的结果.

我认为可以为每个对象创建两个新对象,列出在另一个对象中找不到的项目?或者我是否以某种方式使用 compare-object 的输出引用以前的对象并产生一些格式化的输出?

此代码当前生成一个空白文件。

数据格式:

$SNObject:

名称、IP、类别

server-place.com,10.10.10.10,windows 服务器

$QRObject:

名称、日期、IP、通用、设备类型

server-place1.com,11.11.11.11,随机信息,linux服务器

代码示例:

$compare = compare-object $SNObject $QRObject -property Name    | 

foreach  { 
  if ($_.sideindicator -eq '<=')
    {$_.sideindicator = $PathToQRReport }

  if ($_.sideindicator -eq '=>')
    {$_.sideindicator = $PathToSNReport}
 }

$compare | 
select @{l='Value';e={$_.InputObject}},@{l='File';e={$_.SideIndicator}} |
Out-File -FilePath C:\Temp\MissingOutputs1.txt

【问题讨论】:

  • 我相信正在发生的事情是,在您的 foreach-object 循环中,您正试图为不存在的对象($_.sideindicator)上的属性分配一个值,并且也没有发出您的 $compare 变量赋值的其他任何内容,这就是它为空的原因。循环后检查 $compare 以确认。

标签: arrays powershell object


【解决方案1】:

啊...只是想到了一个替代方案,它可以为您提供您正在寻找的东西,但方式略有不同:

   ## Join both arrays into single array and then group it on the property name that has a shared value, 'name'
$all = @()
$group = @($SNObject + $QRObject)
$group | Group-Object -Property name | % {
    ## Create a custom object that contains all possible properties plus a directionality indicator ('source')
    $n = New-Object PSObject -Property @{
        'name' = ''
        'date' = ''
        'ip' = ''
        'general' = ''
        'platform' = ''
        'source' = ''
    }

    if ($_.Count -eq 1) {
        ## Loop through the grouped results and determine their source and write properties based off of their source
        foreach ($i in $_.Group) {

            if (@($i | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty name) -contains 'date' ) {
                ## This value came from $QRObject which apparently is the only dataset that contains a date property
                $n.source = 'QRObject'
                $n.date = $i.date
                $n.general = $i.general
                $n.platform = $i.'device type'
            } else {
                ## This object does not contain the 'date' property, therefore it came from $SNObject    
                $n.source = 'SNObject'
                $n.platform = $i.class
            }

            ## write out common properties
            $n.name = $i.name
            $n.ip = $i.ip

            ## add the custom PSObject back to a master array with all formatted properties
            $all += $n
        }
    }
}

$all | out-whereever-you-want

【讨论】:

  • 你必须原谅我的无知。我已经实施了您的建议,因为我认为它非常有意义。我使用您的编辑将其引用为 $group。然后我应该根据 name 属性排序唯一吗?如果是这样,我如何判断它当时来自哪个对象?
  • 我有点把它留给你,因为我不完全确定你想要实现什么:具有相同属性的单一格式的所有对象,单个容器中的所有对象(例如数组) , 单一格式的所有对象都知道每个对象来自哪一侧,等等。
  • 我试图找到唯一的项目(基于 name 属性),然后告诉它们最初存在的位置(哪个对象)并显示其他对象中缺少哪些项目。结果具有它们最初具有的所有属性。结果可能在两个新对象中,例如SNObject-Unique 和 QRObject-Unique,因此我可以轻松地引用对象及其属性并最终生成一个不错的报告。
  • 只要每个数组中只有一个主机名条目,如果计数大于 htan 1,则跳过: if ($_.Group.Count -eq 1) { 完成工作}。提供一切背后的逻辑是,如果您导出到 csv 并按主机名排序,您可以通过它们只有一个条目来判断哪些不在任一侧。两者都有一个双重条目。见编辑
  • 另外,如果您只关心单数结果,您实际上可以删除 foreach 循环并重新编码 $_.Group[0].propertyname 的单个项目定位,但我将把它留给您.无论如何,循环应该仍然有效。
猜你喜欢
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多