Как добавить элементы в мой массив с помощью ForEach-Object - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь экспортировать определенные свойства запроса из системы CRM для создания пользовательских отчетов в Excel.Поскольку у меня нет прямого доступа к серверу sql, я использую API.Ответ API может быть XML или JSON.

Мой первый запрос возвращает около 13 запросов и их базовые данные, основанные на представлении, которое я настроил в CRM, затем мне нужно использовать второй запрос, чтобы получить дополнительные поля длякаждый запрос.Поэтому я попытался создать массив, в котором я мог бы хранить все необходимые поля, а затем экспортировать его в один CSV-файл.

Однако, когда я пытаюсь добавить новые элементы в мой массив с помощью ForEach-Object, он просто перезаписываетодин и тот же элемент снова и снова.

Также на моем втором Invoke-RestMethod для -Uri я должен использовать «текущий» номер запроса, но я не уверен, как правильно ссылаться на него.

$inputdata = @"
{
    "operation": {
        "details": {
            "from": "0",
            "limit": "200",
            "filterby": "9304_MyView"
        }
    }
}
"@

$Params = @{OPERATION_NAME='GET_REQUESTS';INPUT_DATA=$inputdata;TECHNICIAN_KEY='mykey';format='json'}
$Response = Invoke-RestMethod -Uri http://myserver/request -Method Post -Body $Params
$RequestNumber = $Response.operation.details.WORKORDERID
$current = $RequestNumber[0]

$array = @()
ForEach-Object -InputObject $RequestNumber {
$Parameter = @{OPERATION_NAME='GET_REQUEST';TECHNICIAN_KEY='mykey'}
$data = Invoke-RestMethod -Uri http://myserver/request/$current -Method GET -Body $Parameter

$object = New-Object -TypeName PSObject
$object | Add-Member -Name 'RequestNumber' -MemberType NoteProperty -Value $data.API.response.operation.Details.parameter.value[0]
$object | Add-Member -Name 'Subject' -MemberType NoteProperty -Value $data.API.response.operation.Details.parameter.value[12] 
$array += @($object)
    }

Может кто-нибудь объяснить, что я делаю не так?* Извините, английский не мой родной язык, но я надеюсь, что он имеет некоторый смысл.

Решение, основанное на предложении Мервальда

Я узнал, что с помощью параметра -InputObject обработал мой $RequestNumber как один объект и передал весь «номер билета», поэтому я переместил создание массива над $ RequestNumber, а затем передал $ RequestNumber в ForEach-Object.

$inputdata = @"
{
    "operation": {
        "details": {
            "from": "0",
            "limit": "200",
            "filterby": "9304_MyView"
        }
    }
}
"@

$Params = @{OPERATION_NAME='GET_REQUESTS';INPUT_DATA=$inputdata;TECHNICIAN_KEY='mykey';format='json'}
$Response = Invoke-RestMethod -Uri http://myserver/request -Method Post -Body $Params
$array = @()
$RequestNumber = $Response.operation.details.WORKORDERID |

ForEach-Object {
    $Parameter = @{OPERATION_NAME='GET_REQUEST';TECHNICIAN_KEY='mykey'}
    $data = Invoke-RestMethod -Uri http://myserver/request/$_ -Method GET -Body $Parameter

    $object = New-Object -TypeName PSObject
    $object | Add-Member -Name 'RequestNumber' -MemberType NoteProperty -Value $data.API.response.operation.Details.parameter.value[0]
    $object | Add-Member -Name 'Subject' -MemberType NoteProperty -Value $data.API.response.operation.Details.parameter.value[12] 
    $array += $object
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Ваш $ массив каждый раз сбрасывается путем создания нового массива.Следующий код просто перебирает числа для простоты.Примечание: + = создает массив с нуля, поэтому производительность может быть проблемой (см. Подробный ответ FoxDeploy для объяснения причины).

$array = @()


0..20 | ForEach-Object { 

    $object = $_
    # Use += for adding to an array
    $array += $object
}

Write $array

Более быстрый способ сделать то же самоеоперация заключается в использовании .Net ArrayList.За ответ FoxDeploy .

$array = new-object System.Collections.ArrayList

0..20 | ForEach-Object { 

    $object = $_
    # Call the Method Add here
    $array.Add($object)
}

Write $array
0 голосов
/ 14 мая 2019

$current всегда указывает на $RequestNumber[0], поэтому $data всегда содержит одни и те же данные.

$inputdata = @"
{
    "operation": {
        "details": {
            "from": "0",
            "limit": "200",
            "filterby": "9304_MyView"
        }
    }
}
"@

$Params = @{OPERATION_NAME='GET_REQUESTS';INPUT_DATA=$inputdata;    TECHNICIAN_KEY='mykey';format='json'}
$Response = Invoke-RestMethod -Uri http://myserver/request -Method Post -Body $Params
$RequestNumber = $Response.operation.details.WORKORDERID

$array = @()
ForEach-Object -InputObject $RequestNumber {
    $Parameter = @{OPERATION_NAME='GET_REQUEST';TECHNICIAN_KEY='mykey'}
    $data = Invoke-RestMethod -Uri http://myserver/request/$_ -Method GET -Body $Parameter

    $object = New-Object -TypeName PSObject
    $object | Add-Member -Name 'RequestNumber' -MemberType NoteProperty -Value     $data.API.response.operation.Details.parameter.value[0]
    $object | Add-Member -Name 'Subject' -MemberType NoteProperty -Value    $data.API.response.operation.Details.parameter.value[12] 
    $array += $object
}

Пытался исправить код, см. Выше. Я удалил $current и использовал фактический объект в конвейере (= $_, about_pipelines ) для Invoke-RestMethod. Я также изменил $array += @($object) на $array += $object, так как вы хотите добавить объект в массив, а не новый массив в массив (это то, что означает оператор подвыражения массива @() ).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...