Объединение результатов API в один объект в Powershell

У меня есть две конечные точки API для доступа и получения информации о пользователе и записи данных в таблицу SQL. Конечная точка использует идентификатор сотрудника в URL-адресе, поэтому я перебираю каждого пользователя, чтобы получить его данные. Endpoint #2 содержит настраиваемые поля для пользователя. Я пытаюсь объединить результаты обеих конечных точек и записать их в виде одной строки для каждого пользователя в таблице SQL.

Они возвращают PSCustomObject в виде хэш-таблицы. Конечная точка № 1: cat6 NoteProperty string cat6=NONE

Конечная точка № 2: CustomText94 NoteProperty System.Management.Automation.PSCustomObject CustomText94=@{description=; значение=}

function Export-Feed {

    Begin {
        $serverInstance = ""
        $database = ""
        $tableName = ""
        $employees = Get-Directory | Where-Object eestatus -eq A
    }

    Process {
        $result = $employees | ForEach-Object -Parallel {
            $params = @(
                'firstname',
                'middlename',
                'lastname',
                @{n='ADID';e={(Connect-Api -apiEndpoint "/api/v1/employee/$($_.eecode)/customfield").CustomText04.value}},
                'hire_date',
                'rehire_date',
                'position_title',
                'termination_date',
                'work_email',
                'employee_code',
                'clocksequencenumber',
                'department_code',
                'department_description',
                'employee_status',
                'supervisor_primary',
                'supervisor_primary_code',
                'supervisor_secondary',
                'supervisor_secondary_code',
                'supervisor_tertiary',
                'supervisor_tertiary_code',
                'supervisor_quaternary',
                'cat1',
                'cat1desc',
                'cat2',
                'cat2desc',
                'cat3',
                'cat3desc',
                'cat4',
                'cat4desc',
                'cat5',
                'cat5desc',
                'cat6',
                'cat6desc',
                'cat7',
                'cat7desc',
                'cat8',
                'cat8desc',
                'cat9',
                'cat9desc'
            )


            Connect-Api -apiEndpoint "/api/v1/employee/$($_.eecode)" | Select-Object $params

        }
    }
    
    End {
        $result | Out-File c:\temp\test.txt
        #Write-SqlTableData -DatabaseName $database -TableName $tableName -ServerInstance $serverInstance -SchemaName dbo -InputData $result -force 
    }
}

person wimp777    schedule 15.10.2020    source источник
comment
@mklement0 попался. Новое в переполнении стека. Я попытался отдать должное вашему ответу. Он сказал, что сделал, но не показывает это публично из-за уровня моей учетной записи. Спасибо за помощь. Я воспользовался вашим объяснением [pscustomobject] и получил рабочий результат, который меня устраивает.   -  person wimp777    schedule 16.10.2020
comment
Рад это слышать, @wimp777 - спасибо, что приняли. Ваши голоса станут видны, как только вы наберете 15 очков репутации.   -  person mklement0    schedule 16.10.2020


Ответы (1)


Чтобы объединить два настраиваемых объекта (экземпляры [pscustomobject], которые отличны от хеш-таблиц), используйте следующую технику:

# Two sample input objects.
$o1 = [pscustomobject] @{ one  = 1; two  = 2; three = 3 }
$o2 = [pscustomobject] @{ four = 4; five = 5; six   = 6 }

# Merge the two, by appending the properties of the 2nd to the 1st.
# Note: This assumes that there is no overlap between the property names.
foreach ($prop in $o2.psobject.Properties) {
  $o1.psobject.Properties.Add($prop, $true)
}

# $o1 now contains the union of both property sets; 
# Output it.
$o1 | Format-Table

Вышеизложенное дает:

one two three four five six
--- --- ----- ---- ---- ---
  1   2     3    4    5   6

Вышеприведенное основано на том, что каждый объект в PowerShell имеет скрытое свойство .psobject, которое предоставляет информацию об отражении объекта, в частности набор всех свойств, возвращаемых свойством .Properties.

PowerShell позволяет динамически добавлять свойства к любому свойству, что является особенностью его ETS (расширенная система типов). [pscustomobject] экземпляров содержат только такие динамические свойства. .Add() метод позволяет добавить к объекту копию свойства другого объекта; $true указывает, что проверка не требуется, что ускоряет операцию.

person mklement0    schedule 15.10.2020