2013-06-05 25 views
13

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.

+4

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 –

+0

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 –

+0

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

Odpowiedz

4

Keith Hill wspomniał w komentarzu, że jest to nowa funkcja o nazwie Wyliczenie członków w V3. Patrz: this MSDN article.

+2

W celu uzupełnienia komentarza @SteveKaye, dodam przynajmniej "dlaczego" z linku doskonałego, powyżej. '" Dodaliśmy tę funkcję, aby ułatwić sobie radzenie sobie z poleceniami, które zwracają jeden lub wiele obiektów. "Doświadczeni skrypty PowerShell wiedzieli, że muszą używać @(), aby poprawnie obsłużyć tę sytuację, ale naprawdę uważaliśmy, że to nie jest doskonałe ... Nie znamy żadnych skryptów, w których ta zmiana spowodowała złamanie skryptu, ale nie ujawniła w skrypcie problemu ". Ciekawa funkcja. – ruffin

Powiązane problemy