Raccourcir les noms de propriété
Malheureusement, contrairement aux paramètres, les propriétés / méthodes (tout ce qui est accédé par un point .
) ne peuvent généralement pas être réduites à leur forme non ambiguë.
Mais certaines cmdlets peuvent opérer sur les noms de propriété et prendre des caractères génériques, et il existe des ensembles de paramètres peu connus de %
et ?
qui peuvent être utiles.
Habituellement, nous transmettons un bloc de script et faisons référence à l'élément avec $_
, mais il existe une autre forme de ceux-ci qui prend un nom de propriété et accepte un caractère générique.
$o|select Le*
$o|%{$_.Length}
Avec une propriété comme celle-ci, .Length
nous ne pouvons pas utiliser la magie v3 qui fonctionnerait normalement sur un tableau car il Length
s'agit d'une propriété du tableau lui-même. Les deux propriétés ci-dessus peuvent donc être utilisées pour obtenir les longueurs des membres individuels. Le select
vient dans un peu plus court.
Mais %
peut prendre directement un nom de propriété et renvoyer cette valeur:
$a|% Length
Ce qui peut être raccourci avec des jokers. Le caractère générique doit être résolu en une seule propriété (ou méthode, à ce sujet plus tard), de sorte qu'il générera une erreur utile s'il ne le fait pas, indiquant exactement quels membres il pourrait résoudre.
Dans le cas de Length
, Le*
est généralement le plus court. Même sur une seule chaîne, cette méthode est plus courte d'un octet que la simple utilisation de la propriété.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Mais selon ce que vous faites avec cela, cela peut être pire. Vous pouvez le faire, $a.Length*5
mais pour le faire avec l'expression du pipeline, vous devez l'envelopper ($a|% Le*)*5
; Cela peut toujours valoir la peine si cela est contre un tableau, mais le fait est que ce n’est pas toujours approprié comme substitution directe.
Cela fonctionne aussi avec les méthodes, et vous pouvez laisser le ()
nom complet de la même longueur, mais les mêmes restrictions que ci-dessus concernant le fait de devoir l’emballer. La méthode doit avoir une surcharge qui ne prend aucun paramètre (vous pouvez passer des arguments en les plaçant après le nom de la méthode, ce qui est très pratique):
$a.ToUpper() # 12
$a|% *per # 9
Avec des arguments:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Ce ne sont pas strictement les mêmes en ce que le -replace
opérateur effectue un remplacement d'expression régulière, mais si vous remplacez simplement une chaîne, il peut (maintenant) être plus court pour utiliser la méthode; il est utile que les chaînes soient des arguments d'applets de commande plutôt que des arguments de méthodes, de sorte qu'elles n'ont pas besoin d'être citées.
Propriétés Where-Object
?
peut également prendre des noms de propriété (partiels) et y appliquer un "opérateur" (sous la forme de paramètres de commutateur). Là encore, cela peut être plus court que d'utiliser l' Where-Object
approche scriptblock standard si le nom de la propriété est suffisamment long et unique.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs