【发布时间】:2017-04-17 09:09:28
【问题描述】:
此刻我完全陷入了思维循环:
我想解决通过值而不是引用将数组传递给函数的问题,并找到了这个解决方案: Is Arraylist passed to functions by reference in 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 循环中修改原始数组的副本。在我的真实脚本中,数组由自定义 PSObjects 组成,但行为是相同的。
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 循环:
for($i = 0; $i -lt $local.Count; $i++){ $local[$i] = 100 } -
谢谢,但这似乎不适用于对象,请参阅我原始帖子底部的更新。任何其他想法如何处理?
标签: arrays powershell foreach pass-by-reference pass-by-value