В данный момент я полностью запутался:
Я хотел решить проблему передачи массива функции по значению вместо ссылки и нашел следующее решение: Передается ли Arraylist функциям по ссылке в PowerShell.
Метод .Clone () работает так, как ожидалось:
function testlocal {
param ([collections.arraylist]$local)
$local = $local.Clone()
$local[0] = 10
return $local
}
$local = [collections.arraylist](1,2,3)
'Testing function arraylist'
$copyOfLocal = testlocal $local
$copyOfLocal
'Testing local arraylist'
$local
Выход:
Testing function arraylist
10
2
3
Testing local arraylist
1
2
3
Но теперь мне нужно обработать элементы массива в цикле foreach. Тогда происходит то, что массив не изменяется с помощью цикла foreach (???). Я затрудняюсь понять это, несмотря на множество исследований. Не могли бы вы объяснить мне, что происходит за кулисами и как я могу этого избежать? Мне нужно изменить копию исходного массива в цикле foreach функции. В моем реальном сценарии массив состоит из настраиваемых объектов PSObject, но поведение такое же.
function testlocal {
param ([collections.arraylist]$local)
$local = $local.Clone()
$local[0] = 10
foreach ($item in $local) {
$item = 100
}
return $local
}
$local = [collections.arraylist](1,2,3)
'Testing function arraylist'
$copyOfLocal = testlocal $local
$copyOfLocal
'Testing local arraylist'
$local
Цикл foreach не изменяет вывод:
Testing function arraylist
10
2
3
Testing local arraylist
1
2
3
ОБНОВЛЕНИЕ 2016-12-14 Совет с циклом for работает, но оказывается, что при использовании объектов все клонирование снова разваливается:
function testlocal {
param ([collections.arraylist]$local)
$local = $local.Clone()
for($i = 0; $i -lt $local.Count; $i++){
$local[$i].Hostname = "newname"
}
return $local
}
$target1 = New-Object -TypeName PSObject
$target1 | Add-Member -MemberType NoteProperty -Name "Hostname" -Value "host1"
$target2 = New-Object -TypeName PSObject
$target2 | Add-Member -MemberType NoteProperty -Name "Hostname" -Value "host2"
$local = [collections.arraylist]($target1,$target2)
'Testing function arraylist'
$copyOfLocal = testlocal $local
$copyOfLocal | ft
'Testing local arraylist'
$local | ft
Выход:
Testing function arraylist
Hostname
--------
newname
newname
Testing local arraylist
Hostname
--------
newname
newname
Внезапно я снова возвращаюсь к переходу по ссылке. Это сводит меня с ума! Пожалуйста помоги!
for($i = 0; $i -lt $local.Count; $i++){ $local[$i] = 100 }
- person Mathias R. Jessen   schedule 02.12.2016