tl; dr
Я предлагаю реорганизовать ваш код, чтобы избежать вашей проблемы, и он более эффективен и обеспечивает лучшую инкапсуляцию:
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
, создаваемая присваиванием, наследует тип (и значение) переменнойто же имя из родительской области (см. этот ответ , чтобы узнать больше о области видимости в PowerShell).
Если $SiteIDs
действительно является массивом в области действия сценария, локальная копия также будетсоздать массив - но это все равно не изменит массив original в script scope.
Тот факт, что $SiteIDs
в вашем случае в итоге содержал конкатенацию строк идентификаторов вашего сайта, говорит о том, что ваш фактический код либо делает не создайте переменную $SiteIDs
в области действия скрипта, или она будет string -тип там, а не array (@()
) , потому чтоприменение +=
со строкой в качестве RHS к переменной с типом [string]
или ранее не существовавшим выполняет простую конкатенацию строк (добавляет RHS непосредственно к существующему значению, которое по умолчанию равно пустой строке, если переменная
немедленное исправление будет:
Убедитесь, что $SiteIDs = @()
действительноопределенный в области действия сценария, то есть как массив .
Измените $SiteIDs += $siteid
на $script:SiteIDs += $siteid
, чтобы непосредственно изменить переменную области сценария,как и предполагалось.
Тем не менее, , как правило, лучше избегать обращения к переменным через границы области видимости.ries - используйте параметры и локальные переменные для лучшей инкапсуляции, как показано в верхней части.