这是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/