PowerShell Compare-Object для создания файла отчета об изменениях

Я просмотрел множество примеров и добился прогресса в составлении отчета об изменениях. Но я застрял в одной области. Вот сценарий...

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 в отчет об изменениях. 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
    }
}

Спасибо Тео за понимание того, как использовать 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
    }
}

person Joseph K. Perez    schedule 18.06.2020    source источник
comment
Вы пробовали опцию -passthru для объекта сравнения? Или посмотрите на возвращенное свойство inputobject.   -  person js2010    schedule 18.06.2020
comment
@ js2010 Перепробовал кучу всего. Тео предоставил подсказку и ответ, используя Where-Object. Таким образом, в моем коде, просто для удобства чтения для начинающих, внутри строки If перед заполнением $TempObject я могу просто добавить эту строку $orgID = $RefObj | Где-Имя объекта -eq $Row.Name. Затем первый элемент в $TempObject добавьте эту строку, ID = $orgID.ID   -  person Joseph K. Perez    schedule 19.06.2020


Ответы (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 Name  Location Gender
-- ----  -------- ------
1  Peter USA      Female
3  Mary  USA      Female
   Tom   PI       Female
   Barry CAN      Male
person Theo    schedule 18.06.2020
comment
Спасибо. Я ценю, что вы прошли через это для решения. Теперь я понимаю, как сопоставлять и ссылаться на поле из основного файла с помощью Where-Object. Также оценил расширенную (ярлык) нотацию в вашем примере. - person Joseph K. Perez; 19.06.2020