首页 > 解决方案 > 如何使用 ForEach-Object 将项目添加到我的数组

问题描述

我正在尝试从 CRM 系统导出特定的请求属性以在 excel 中构建自定义报告。由于我无法直接访问它的 sql 服务器,因此我正在使用 API。API 响应可以是 XML 或 JSON。

我的第一个查询根据我在 CRM 中设置的视图返回大约 13 个请求及其基本详细信息,然后我需要使用第二个查询来获取每个请求的附加字段。所以我尝试创建一个数组,我可以在其中存储我需要的所有字段,然后可以稍后将其导出到单个 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)
    }

有人可以解释我做错了什么吗?*对不起,英语不是我的母语,但我希望它有意义。

基于 Moerwald 建议的解决方案

我了解到,使用 -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
}

标签: xmlpowershell

解决方案


$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,因为您想向数组中添加一个对象,而不是向数组中添加一个新数组(这是@() 数组子表达式运算符所代表的内容)。

希望有帮助。


推荐阅读