Если вы уменьшите свой код до минимального сценария, который воспроизводит поведение, вы получите что-то вроде этого:
$ValidatedHostServers = @( "xxx" );
function ValidateHost
{
write-host "inside before = '$($ValidatedHostServers | ConvertTo-Json)'";
$ValidatedHostServers += "smp001-01";
$ValidatedHostServers += "sl1ps01-13-9";
write-host "inside after = '$($ValidatedHostServers | ConvertTo-Json)'";
write-host ($ValidatedHostServers | ConvertTo-Json)
}
write-host "value before = '$($ValidatedHostServers | ConvertTo-Json)'";
ValidateHost;
write-host "value after = '$($ValidatedHostServers | ConvertTo-Json)'";
, который выводит следующее:
value before = '"xxx"'
inside before = '"xxx"'
inside after = '"smp001-01sl1ps01-13-9"'
value after = '"xxx"'
Я думаю, что здесь происходят две вещи:
- Ваша функция выполняется в дочерней области , поэтому изменения, внесенные в вашу функцию в переменные, определенные в родительской области (т. Е. $ ValidatedHostServer), не сохраняются при выходе из функции - см. Цитату из дочерней области ссылка:
элементы, которые вы создаете и изменяете в дочерней области, не влияют на родительскую область,
если вы явно не укажете область при создании элементов.
- Возможно, в PowerShell есть ошибка в присваивании оператором сложения (т. Е. '+ ='), Когда он впервые присваивает значение родительской переменной в дочерней области - в основном он обрабатывает $ ValidatedHostServers как если бы он был неопределенным и преобразовал его в строку, что затем заставляет второй + = выполнять конкатенацию строк вместо добавления массива.
Вы можете обойти обе эти проблемы следующим образом:
#$ValidatedHostServers = @( "xxx" ); <- replace this with the next line
Set-Variable -Name "ValidatedHostServers" -Option AllScope -Value @( "xxx" );
Опция «AllScope» позволяет дочерней области (то есть функции) изменять переменные в родительской области, чтобы ваши изменения сохранялись после существования функции. Это также позволяет избежать потенциальной ошибки в «операторе присваивания».
Set-Variable -Name "ValidatedHostServers" -Option AllScope -Value @( "xxx" );
function ValidateHost
{
write-host "inside before = '$($ValidatedHostServers | ConvertTo-Json)'";
$ValidatedHostServers += "smp001-01";
$ValidatedHostServers += "sl1ps01-13-9";
write-host "inside after = '$($ValidatedHostServers | ConvertTo-Json)'";
write-host ($ValidatedHostServers | ConvertTo-Json)
}
write-host "value before = '$($ValidatedHostServers | ConvertTo-Json)'";
ValidateHost;
write-host "value after = '$($ValidatedHostServers | ConvertTo-Json)'";
и тогда мы получим этот вывод
value before = '"xxx"'
inside before = '"xxx"'
inside after = '[
"xxx",
"smp001-01",
"sl1ps01-13-9"
]'
[
"xxx",
"smp001-01",
"sl1ps01-13-9"
]
value after = '[
"xxx",
"smp001-01",
"sl1ps01-13-9"
]'
UPDATE
Связанные проблемы в репозитории PowerShell github: