Po prostu zdałem sobie z tego sprawę i nauczyłem się tego na własnej skórze, więc chcę się podzielić. Rozważmy masz następującą listę ciągów:Gotcha korzystania z kolekcji .NET (ArrayList, List, ..) w PowerShell
>$list = New-Object -TypeName System.Collections.Generic.List[string]
>$list.Add("x")
>$list.Add("yy")
>$list.Add("zzz")
>$list
x
yy
zzz
Teraz, jeśli chcesz uzyskać liczbę elementów na liście, by uzyskać dostęp do właściwości .Count, a to daje „3” zgodnie z oczekiwaniami.
>$list.Count
3
Jednak czasami popełnisz błąd, uzyskując dostęp. Długość zamiast .Count. W innych językach, takich jak Python lub C#, pojawi się błąd informujący, że ta właściwość nie jest dostępna. Ale w PowerShellu okazuje się, że jeśli nie zostanie znaleziony na tym obiekcie, iteruje on przez zawarte obiekty i uzyskuje dostęp do właściwości na nich. Więc kończy się lista Lengthes! Niespodzianka!!
>$list.Length
1
2
3
Można nawet wywoływać metody!
>$list.ToUpper()
X
YY
ZZZ
Należy zauważyć, że tak jak próbowałem, ta "funkcja" działa również dla System.Collections.ArrayList. Ale nie działa dla wbudowanego typu macierzy PowerShell.
Jak nazywa się ta "funkcja"? I dlaczego jest zaprojektowany w taki sposób? Jest to bardzo zaskakujące i podatne na błędy.
Nazywa się wiele rzeczy. Wyliczenie członków jest najnowszym IIRC. Zobacz http://blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx –
Nie podoba mi się ta nowa "funkcja" (wprowadzona w PSv3) - to sprawia, że twój skrypt jest wstecz niekompatybilny z PSv2 ... :(Naprawdę nie sądzę, że nieco mniejsza liczba znaków uzasadnia łamanie wstecznej kompatybilności –
Andy, starzeję się, więc gdzieś się podzielę twoją opinią, ale jeśli jakiś nowy skrypty nie będą działać w PowerShell V2.0, Cokolwiek się stanie, stare skrypty, które naprawdę działały w PowerShell V2.0 będą działać w PowerShell V3.0 Jak zwykle w sprzęcie komputerowym trzeba trzymać się starszej technologii, to nie powinno się zatrzymywać technologie do postępu – JPBlanc