Skracanie nazw nieruchomości
Niestety, w przeciwieństwie do parametrów, właściwości / metody (wszystko dostępne za pomocą kropki .
) zwykle nie może być skrócone do jednoznacznej formy.
Ale niektóre aplety poleceń może działać nazw właściwości i podjąć symbole wieloznaczne, a tam są mało znane zestawy parametrów z %
i ?
które mogą być użyteczne.
Zwykle przekazujemy blok skryptu i odnosimy się do elementu za pomocą $_
, ale istnieje inna forma, która przyjmuje nazwę właściwości i akceptuje symbol wieloznaczny.
$o|select Le*
$o|%{$_.Length}
W przypadku takiej właściwości .Length
nie możemy użyć magii v3, która normalnie działałaby na tablicy, ponieważ Length
jest ona właściwością samej tablicy, więc powyższe dwie wartości można wykorzystać do uzyskania długości poszczególnych elementów. Jest select
nieco krótszy.
Ale %
może wziąć nazwę właściwości bezpośrednio i zwrócić tę wartość:
$a|% Length
Które można skrócić za pomocą symboli wieloznacznych. Symbol wieloznaczny musi zostać rozpoznany jako pojedyncza właściwość (lub metoda, więcej na ten temat później), więc jeśli nie, wyśle pomocny błąd, wskazując dokładnie, do których elementów mógłby rozwiązać.
W przypadku Length
, Le*
jest zwykle najkrótszy. Nawet w przypadku pojedynczego ciągu ta metoda jest o 1 bajt krótsza niż zwykłe użycie właściwości.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Ale w zależności od tego, co z tym robisz, może być gorzej. Możesz $a.Length*5
zrobić to tylko za pomocą wyrażenia potoku, które musiałbyś zawinąć ($a|% Le*)*5
; może nadal warto, jeśli jest przeciwko tablicy, ale chodzi o to, że nie zawsze jest odpowiednia jako prosta zamiana.
Działa również z metodami i możesz pominąć tę, ()
która sprawia, że pełna nazwa ma taką samą długość, ale takie samo ograniczenie, jak powyżej, dotyczące czasami konieczności jej zawijania. Metoda musi mieć przeciążenie, które nie przyjmuje parametrów (możesz przekazać argumenty, umieszczając je po nazwie metody, co jest naprawdę fajne):
$a.ToUpper() # 12
$a|% *per # 9
Z argumentami:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Nie są one dokładnie takie same, ponieważ -replace
operator zastępuje wyrażenia regularne, ale jeśli po prostu zastępujesz ciąg znaków, użycie metody może być (teraz) krótsze; pomaga to, że ciągi są argumentami cmdlet zamiast argumentów metod, więc nie trzeba ich cytować.
Właściwości Where-Object
?
może również przyjmować (częściowe) nazwy właściwości i stosować do niej „operator” (w postaci parametrów przełącznika). Ponownie może to być krótsze niż użycie standardowego Where-Object
podejścia do blokowania skryptów, jeśli nazwa właściwości jest wystarczająco długa i unikalna.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs