Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell ForEach调用rest方法_Powershell_Cisco - Fatal编程技术网

Powershell ForEach调用rest方法

Powershell ForEach调用rest方法,powershell,cisco,Powershell,Cisco,我试图向Cisco Prime API的AccessPointsDetails端点发出请求,然后通过该端点循环获取AccessPoints的所有URL对象,以便获取每个访问点的数据 我得到以下输出: VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3373245; $=3373245} VERBOSE: Making r

我试图向Cisco Prime API的AccessPointsDetails端点发出请求,然后通过该端点循环获取AccessPoints的所有URL对象,以便获取每个访问点的数据

我得到以下输出:

VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3373245; $=3373245}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3413720; $=3413720}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3432295; $=3432295}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3432310; $=3432310}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3462672; $=3462672}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3497980; $=3497980}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3497993; $=3497993}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3512621; $=3512621}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3526872; $=3526872}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/16162527426; $=16162527426}
@type              @url                                                            $          
-----              ----                                                            -          
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3373245     3373245    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3413720     3413720    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3432295     3432295    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3432310     3432310    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3462672     3462672    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3497980     3497980    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3497993     3497993    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3512621     3512621    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3526872     3526872    
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/16162527426 16162527426
以下是一个商店的JSON响应:

{
  "queryResponse": {
    "@last": 9,
    "@first": 0,
    "@count": 10,
    "@type": "AccessPointDetails",
    "@requestUrl": "https://cpist/webacs/api/v3/data/AccessPointDetails?.group=0026",
    "@responseType": "listEntityIds",
    "@rootUrl": "https://cpist/webacs/api/v3/data",
    "entityId": [
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3373245",
        "$": "3373245"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3413720",
        "$": "3413720"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3432295",
        "$": "3432295"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3432310",
        "$": "3432310"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3462672",
        "$": "3462672"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3497980",
        "$": "3497980"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3497993",
        "$": "3497993"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3512621",
        "$": "3512621"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3526872",
        "$": "3526872"
      },
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/16162527426",
        "$": "16162527426"
      }
    ]
  }
}
我觉得我可能有点焦头烂额,犯了个愚蠢的疏忽

解决方案代码(见接受答案):

Function allAP {
Write-Verbose "Getting all APs for Store $Store"
$storeApReq = "https://cpist/webacs/api/v3/data/AccessPointDetails.json?.group=$Store"
Write-Verbose "Making request to $storeApReq"
$Global:apIdListReq = Invoke-RestMethod -uri $storeApReq -method Get -ContentType 'application/json' -headers @{ Authorization = $auth }
$Global:apIdList =  $apIdListReq.queryResponse.entityId
$Global:apIdCount =  $apIdListReq.queryResponse."@count"

Write-Verbose "Found $siteAPCount APs in Sites Database. $apIdCount out of $siteAPCount APs found."
Write-Verbose "Response Received: $apIdList"
$Global:apIdURL =  $apIdListReq.queryResponse.entityId
$Global:apURL = $apIdUrl.'@url'

Write-Verbose "Starting a loop."
ForEach($apIdURL in $apIdList) {
Invoke-RestMethod -uri $apURL -method Get -ContentType 'application/json' -headers @{ Authorization = $auth }
Write-Verbose "Making request to: $apURL"
$apURL

}
}

您遇到的最大问题是错误地访问返回对象的成员。
Invoke RestMethod
返回应用程序返回给您的JSON的
pscustomobject
表示。您的示例JSON如下所示:

{
  "queryResponse": {
    "@last": 9,
    "@first": 0,
    "@count": 10,
    "@type": "AccessPointDetails",
    "@requestUrl": "https://cpist/webacs/api/v3/data/AccessPointDetails?.group=0026",
    "@responseType": "listEntityIds",
    "@rootUrl": "https://cpist/webacs/api/v3/data",
    "entityId": [
      {
        "@type": "AccessPointDetails",
        "@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3373245",
        "$": "3373245"
      },

      ...
    ]
  }
}
将其转换为
pscustomobject

[pscustomobject]@{
    'queryResponse' = [pscustomobject]@{
        '@last'         = 9
        '@first'        = 0
        '@count'        = 10
        '@type'         = 'AccessPointDetails'
        '@requestUrl'   = 'https://cpist/webacs/api/v3/data/AccessPointDetails?.group=0026'
        '@responseType' = 'listEntityIds'
        '@rootUrl'      = 'https://cpist/webacs/api/v3/data'
        'entityId'      = @(
            [pscustomobject]@{
                '@type' = 'AccessPointDetails'
                '@url'  = 'https://cpist/webacs/api/v3/data/AccessPointDetails/3373245'
                '$'     = '3373245'
            }

            ...
        )
    }
}
我不确定为什么访问
“@url”
对您不起作用。下面是您尝试执行的工作实现



您的
@url
键正在返回另一个哈希表,因此您需要在它出现时更深一层。@TheIncorrigible1我该怎么做?让我快速发布JSON响应,因为我不确定是否可以更深入。这里:
$Global:apidur=$apIdListReq.queryResponse.entityId。“@url”
。在您的
foreach
访问
apidur
中,执行
$apidur['@url']
以访问正确的成员。请删除我的最后一条评论。我不知道您得到的是
pscustomobject
而不是
hashtable
。您需要改为执行
$apidur.@url'
。您使用的是哪个版本的powershell?如果是v2,则您无法访问自动枚举,这是您的代码试图执行的操作,但似乎失败了。无论出于何种原因,我都会发布一个关于你的问题的答案,
$apidur=$apIdListReq.queryResponse.entityId.@url'
,我必须创建另一个变量来添加
'@url'
,我正在寻找一个好的解释。现在一切都好了,谢谢@你应该能够为每个对象执行
$apIdListReq.queryResponse.entityId | MemberName'@url'
-MemberName
是我要找的操作员,太棒了。使用此方法调用请求是不明智的,还是我应该创建一个单独的循环?@codepowned
invoke RestMethod
不将
uri
对象数组作为参数,因此您仍然需要循环来针对所有端点运行请求。@codepowned因此我遗漏了代码中的一些关键内容。您正确地填充了
URL
列表,但随后又通过再次查看原始
entityId
对象来覆盖它
Invoke RestMethod
是一个v3+cmdlet,因此您有自动枚举,这只是代码中的一个逻辑问题。
function Get-AccessPoint
{
    param
    (
        [Parameter(Position = 0, Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Store
    )

    # function is accessing above-scope variables $auth and $siteAPCount

    Write-Verbose "Retrieving APs for store $Store"
    $uri = "https://cpist/webacs/api/v3/data/AccessPointDetails.json?.group=$Store"
    Write-Verbose "Request: $uri"
    $global:apIdListReq = Invoke-RestMethod -Uri $uri -ContentType application/json -Headers @{Authorization = $auth}
    $global:apIdList = $apIdListReq.queryResponse.entityId
    $global:apIdCount = $apIdListReq.'@count'

    Write-Verbose "Found $siteAPCount APs in Sites Database. $apIdCount out of $siteAPCount APs found."
    foreach ($entity in $apIdList)
    {
        Write-Verbose "Making request to $($entity.'@url')"
        Invoke-RestMethod -Uri $entity.'@url' -ContentType application/json -Headers @{Authorization = $auth}
    }
}