Accorciamento dei nomi delle proprietà
Purtroppo, diversamente dai parametri, le proprietà / i metodi (qualsiasi cosa a cui si accede con un punto .
) non possono in genere essere abbreviati nella sua forma non ambigua.
Tuttavia, alcuni cmdlet possono operare su nomi di proprietà e accettare caratteri jolly e esistono insiemi di parametri poco noti di %
e ?
che possono essere utili.
Di solito passiamo in uno scriptblock e ci riferiamo all'elemento con $_
, ma c'è un'altra forma di questi che prende un nome di proprietà e accetta un carattere jolly.
$o|select Le*
$o|%{$_.Length}
Con una proprietà come .Length
questa non possiamo usare la magia v3 che normalmente funzionerebbe su un array perché Length
è una proprietà dell'array stesso, quindi i due precedenti potrebbero essere usati per ottenere le lunghezze dei singoli membri. La select
arriva in un po 'più breve.
Ma %
può prendere direttamente un nome di proprietà e restituire quel valore:
$a|% Length
Che può essere abbreviato con caratteri jolly. Il carattere jolly deve essere risolto in una singola proprietà (o metodo, ne parleremo più avanti), quindi genererà un errore utile in caso contrario, indicando esattamente a quali membri potrebbe risolvere.
Nel caso di Length
, Le*
è in genere il più breve. Anche su una singola stringa, questo metodo è più corto di 1 byte rispetto all'uso della proprietà.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Ma a seconda di cosa stai facendo, questo può essere peggio. Puoi farlo $a.Length*5
ma per farlo con l'espressione della pipeline dovresti avvolgerlo ($a|% Le*)*5
; potrebbe comunque valerne la pena se è contro un array, ma il punto è che non è sempre appropriato come sostituzione diretta.
Funziona anche con i metodi e puoi tralasciare quello ()
che rende un nome completo della stessa lunghezza, ma la stessa restrizione di cui sopra a volte a doverlo avvolgere. Il metodo deve avere un sovraccarico che non accetta parametri (è possibile passare argomenti posizionandoli dopo il nome del metodo, il che è davvero bello):
$a.ToUpper() # 12
$a|% *per # 9
Con argomenti:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Questi non sono esattamente gli stessi in quanto l' -replace
operatore esegue una sostituzione regex, ma se si sta semplicemente eseguendo una sostituzione di stringa, può (ora) essere più breve per utilizzare il metodo; aiuta che le stringhe siano argomenti del cmdlet anziché argomenti del metodo, quindi non è necessario che siano citate.
Proprietà Where-Object
?
può anche prendere nomi di proprietà (parziali) e applicarvi un "operatore" (sotto forma di parametri switch). Anche in questo caso può essere più breve rispetto all'uso dell'approccio Where-Object
scriptblock standard se il nome della proprietà è sufficientemente lungo e univoco.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs