【问题标题】:PowerShell Compare-Object to produce change report filePowerShell Compare-Object 生成更改报告文件
【发布时间】:2020-06-18 18:45:10
【问题描述】:

我查看了许多示例,并在制作变更报告方面取得了进展。但是,我被困在一个领域。这是场景...

File 1 CSV file sample data
ID,Name,Location,Gender
1,Peter,USA,Male
2,Paul,UK,Male
3,Mary,PI,Female

File 2 CSV file sample data (No ID column)
Name,Location,Gender
Peter,USA,Female
Paul,UK,Male
Mary,USA,Female
Tom,PI,Female
Barry,CAN,Male

文件 2 有变化和增加,即彼得变成了女性,玛丽搬到了美国,汤姆和巴里都是新人。更改报告输出文件包含更改内容。问题是,我不知道如何将文件 1 中的 Peter 和 Mary 的 ID 放入我的变更报告中。 ID 总是空的这是我的代码...(我希望有人能解释一下。在此先感谢。)

$MyCSVFields = @('Name','Location','Gender')
$CompareResults = Compare-Object $RefObj $DffObj -Property $MyCSVFields -IncludeEqual
$NewOrChangedData = @()
Foreach($Row in $CompareResults)
{
    if( $Row.SideIndicator -eq "=>" )
    {                
        $TempObject = [pscustomobject][ordered] @{
            ID = $Row.ID
            Name = $Row.Name
            Location = $Row.Location
            Gender = $Row.Gender
            #Sanity check "Compare Indicator" = $Row.SideIndicator 
        }
        $NewOrChangedData += $TempObject
    }
}

感谢 Theo 提供了关于如何使用 Where-Object 的理解。这是更新后的代码,它使初学者可以保持简单,并且仍然适用于我们。

Foreach($Row in $CompareResults)
{
    if( $Row.SideIndicator -eq "=>" )
    {                
        $myOrgID = $RefObj | Where-Object Name -eq $Row.Name
        $TempObject = [pscustomobject][ordered] @{
            ID = $myOrgID.ID
            Name = $Row.Name
            Location = $Row.Location
            Gender = $Row.Gender
            #Sanity check "Compare Indicator" = $Row.SideIndicator 
        }
        $NewOrChangedData += $TempObject
    }
}

【问题讨论】:

  • 你试过 compare-object 的 -passthru 选项吗?或者查看返回的 inputobject 属性。
  • @js2010 尝试了很多东西。 Theo 使用 Where-Object 提供了线索和答案。因此,在我的代码中,为了让初学者易于阅读,在 If 中,在填充 $TempObject 之前的一行,我可以添加这一行,$orgID = $RefObj | Where-对象名称 -eq $Row.Name。然后在$TempObject的第一个元素,添加这一行,ID = $orgID.ID

标签: powershell compareobject


【解决方案1】:

我也一直在纠结Compare-Object,所以希望有比这个更好的答案:

$RefObj = @'
ID,Name,Location,Gender
1,Peter,USA,Male
2,Paul,UK,Male
3,Mary,PI,Female
'@ | ConvertFrom-Csv

$DffObj = @'
Name,Location,Gender
Peter,USA,Female
Paul,UK,Male
Mary,USA,Female
Tom,PI,Female
Barry,CAN,Male
'@ | ConvertFrom-Csv

$MyCSVFields = @('Name','Location','Gender')
$CompareResults = Compare-Object $RefObj $DffObj -Property $MyCSVFields -PassThru

$NewOrChangedData = $CompareResults | Where-Object { $_.SideIndicator -eq '=>' } | ForEach-Object { 
    $name = $_.Name
    [PsCustomObject]@{
        ID = ($RefObj | Where-Object { $_.Name -eq $name }).ID
        Name = $name
        Location = $_.Location
        Gender = $_.Gender
        #Sanity check "Compare Indicator" = $_.SideIndicator 
    }
}

$NewOrChangedData

结果:

ID 姓名 地点 性别 -- ---- -------- ------ 1 彼得 美国 女 3 玛丽美国女 汤姆 PI 女 巴里 CAN 男

【讨论】:

  • 谢谢。我很感激你通过它来解决问题。我现在了解如何使用 Where-Object 匹配和引用主文件中的字段。还赞赏您示例中的高级(快捷方式)表示法。
猜你喜欢
  • 2015-05-29
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2016-10-24
  • 2016-03-24
相关资源
最近更新 更多