Ich bin in einem Geist Schleife im Moment völlig verloren:Powershell foreach-Schleife: nicht Array-Elemente gesetzt
ich das Problem der Übergabe eines Arrays an eine Funktion von Wert anstelle von Referenz- und fanden diese lösen wollte Lösung: Is Arraylist passed to functions by reference in PowerShell.
Die .Clone() - Methode funktioniert wie erwartet:
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
Ausgang:
Testing function arraylist
10
2
3
Testing local arraylist
1
2
3
Aber jetzt brauche ich die Array-Elemente in einer foreach-Schleife zu verarbeiten. Was dann passiert ist, dass das Array nicht durch die foreach-Schleife (???) modifiziert wird. Das verstehe ich trotz vieler Nachforschungen nicht. Könntest du mir bitte erklären, was hinter den Kulissen passiert und wie ich das vermeiden kann? Ich muss eine Kopie des ursprünglichen Arrays innerhalb einer foreach-Schleife einer Funktion ändern. In meinem echten Skript besteht das Array aus benutzerdefinierten PSObjects, aber das Verhalten ist das gleiche.
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
Ausgabe wird nicht durch die foreach-Schleife geändert:
Testing function arraylist
10
2
3
Testing local arraylist
1
2
3
UPDATE 2016.12.14 Die Spitze mit der for-Schleife funktioniert, aber es stellt sich heraus, wenn Objekte verwenden, die ganze Klonen-Sache fällt wieder auseinander:
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
Ausgang:
Testing function arraylist
Hostname
--------
newname
newname
Testing local arraylist
Hostname
--------
newname
newname
Plötzlich bin ich wieder durch Referenz wieder vorbei. Das macht mich verrückt! Bitte helfen!
Verwenden Sie eine for-Schleife: 'für ($ i = 0; $ i -lt $ local.Count; $ i ++) {$ local [$ i] = 100}' –
Danke, aber das scheint nicht zu funktionieren Objekte, siehe mein Update am Ende meines ursprünglichen Posts. Irgendeine andere Idee, wie man damit umgeht? – Damartala