Acortar nombres de propiedad
Lamentablemente, a diferencia de los parámetros, las propiedades / métodos (todo lo que se accede con un punto .
) no se pueden acortar a su forma inequívoca.
Pero ciertos cmdlets pueden operar con nombres de propiedad y tomar comodines, y hay conjuntos de parámetros poco conocidos %
y ?
que pueden ser útiles.
Por lo general, pasamos un bloque de script y nos referimos al elemento con $_
, pero hay otra forma de estos que toma un nombre de propiedad y acepta un comodín.
$o|select Le*
$o|%{$_.Length}
Con una propiedad como .Length
no podemos usar la magia v3 que normalmente funcionaría en una matriz porque Length
es una propiedad de la matriz en sí misma, por lo que las dos anteriores podrían usarse para obtener las longitudes de los miembros individuales. El select
viene en un poco más corto.
Pero %
puede tomar un nombre de propiedad directamente y devolver ese valor:
$a|% Length
Que se puede acortar con comodines. El comodín debe resolverse en una sola propiedad (o método, más sobre eso más adelante), por lo que arrojará un error útil si no lo hace, indicando exactamente a qué miembros podría resolver.
En el caso de Length
, Le*
suele ser el más corto. Incluso en una sola cadena, este método es 1 byte más corto que simplemente usar la propiedad.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Pero dependiendo de lo que esté haciendo con esto, esto puede ser peor. Puede hacerlo, $a.Length*5
pero para hacerlo con la expresión de canalización, tendría que ajustarlo ($a|% Le*)*5
; aún podría valer la pena si está en contra de una matriz, pero el punto es que no siempre es apropiado como una sustitución directa.
También funciona con métodos, y puede omitir el ()
que hace que un nombre completo tenga la misma longitud, pero la misma restricción que antes, sobre a veces tener que envolverlo. El método debe tener una sobrecarga que no tome parámetros (puede pasar argumentos colocándolos después del nombre del método, lo cual es realmente bueno):
$a.ToUpper() # 12
$a|% *per # 9
Con argumentos:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Estos no son estrictamente iguales en el sentido de que el -replace
operador hace un reemplazo de expresiones regulares, pero si solo está haciendo un reemplazo de cadena, puede (ahora) ser más corto para usar el método; ayuda que las cadenas sean argumentos de cmdlet en lugar de argumentos de método, por lo que no es necesario citarlas.
Propiedades del objeto donde
?
también puede tomar nombres de propiedades (parciales) y aplicarle un "operador" (en forma de parámetros de cambio). Nuevamente, esto puede ser más corto que usar el Where-Object
enfoque estándar de bloque de script si el nombre de la propiedad es lo suficientemente largo y único.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs