这是XML。我正在寻找站点ID。

<result created="2018-10-13T13:11:18-05:00" host="redacted" status="OK">
<items>
<site>
<siteid>399700</siteid>
<name>
<![CDATA[ Warehouse ]]>
</name>
<connection_ok>1</connection_ok>
</site>
<site>
<siteid>547401</siteid>
<name>
<![CDATA[ Monterey Park ]]>
</name>
<connection_ok>1</connection_ok>
</site>
</items>
</result>

要获取我要查找的数据,我首先需要遍历XML以获取客户端ID,然后可以使用客户端ID查找每个客户端的站点ID。一些客户有多个站点。

虽然正确地获得了客户,但由于缺乏更好的期限,因此对站点进行了压缩。

结果:
ClientID: 12345
SiteID: 9876543210

The Site ID should be two individual numbers: 98765 43210

Here are the two functions I am working with:

$ClientsIDs = @()
$SiteIDs = @()

function Get-Clients() {
    $clientdata = Invoke-RestMethod -Uri ($baseurl + $lc)
    $clientid = $clientdata.result.items.client.clientid
    $Script:ClientsIDs += $clientid
    Write-Output("Client ID: " + $ClientsIDs)
}

function Get-Sites() {
    foreach ($id in $Global:ClientsIDs) {
        $sitedata = Invoke-RestMethod -Uri ($baseurl + $ls + $id)
        $siteid = $sitedata.result.items.site.siteid
        $SiteIDs += $siteid
    }
    Write-Output("Site ID: " + $SiteIDs)
}

Get-Clients
Get-Sites

(仅不显示URL。Write-Output只是出于我的利益,以确保正确收集了数据。最终将其删除。)

如何获得$sitedid正确保存在数组中?

最佳答案

tl;博士

我建议重构您的代码,这可以避免您的问题,并且效率更高并且提供更好的封装:

function Get-Sites() {
    # Note: Also consider passing the parent-scope
    #       $ClientsIDs, $baseurl, $ls variables as *parameters* instead.
    foreach ($id in $ClientsIDs){
        $sitedata = Invoke-RestMethod -Uri ($baseurl + $ls + $id)
        # Implicitly output each site ID, which by
        # virtue of being inside a foreach loop outputs
        # all of them as an array.
        $sitedata.result.items.site.siteid
    }
}

# If you wanted to interpret the IDs as *numbers*, you
# could use type [int[]], for instance
[array] $SiteIDs = Get-Sites

至于您尝试了什么:

通过分配给没有范围修饰符$SiteIDs(script)的$script:SiteIDs($SiteIDs),即,您错误地在Get-Sites函数内部创建了本地$SiteIDs变量。

给定范围可以看到但不能直接分配给父范围的变量,则由赋值创建的$SiteIDs的本地副本将从父范围继承同名变量的类型(和值)(请参见this answer了解有关在PowerShell中进行范围界定的更多信息)。

如果$SiteIDs确实是脚本作用域中的数组,则本地副本也将创建一个数组-但这仍不会修改脚本作用域中的原始数组。

在您的情况下,$SiteIDs最终包含站点ID的字符串连接这一事实表明,您的实际代码不是在脚本作用域中创建了@()变量,要么是在此字符串类型,而不是数组(+=) ,因为将带有字符串的[string]作为RHS应用于$SiteIDs = @()类型或先前不存在的变量会执行简单的字符串连接(如果变量没有,则将RHS直接附加到现有值,默认值为空字符串) t存在)。

立即修复是:
  • 确保$SiteIDs += $siteid是在脚本作用域中真正定义的,即数组。
  • $script:SiteIDs += $siteid更改为ojit_code,以便按预期直接修改script-scope变量。

  • 就是说,通常最好避免跨范围边界引用变量-使用参数和局部变量来更好地封装,如顶部所示。

    关于arrays - 通过API XML数据循环未正确添加到数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52796876/

    10-12 18:40