Encurtando nomes de propriedades
Infelizmente, diferentemente dos parâmetros, propriedades / métodos (qualquer coisa acessada com um ponto .
) geralmente não podem ser encurtados para sua forma inequívoca.
Porém, alguns cmdlets podem operar com nomes de propriedades e receber curingas, e há conjuntos de parâmetros pouco conhecidos %
e ?
que podem ser úteis.
Normalmente, passamos um scriptblock e nos referimos ao item com $_
, mas há outra forma que leva o nome de uma propriedade e ele aceita um curinga.
$o|select Le*
$o|%{$_.Length}
Com uma propriedade como .Length
não podemos usar a mágica da v3 que normalmente funcionaria em uma matriz porque Length
é uma propriedade da própria matriz, portanto, as duas acima podem ser usadas para obter os comprimentos dos membros individuais. O select
vem um pouco mais curto.
Mas %
pode pegar um nome de propriedade diretamente e retornar esse valor:
$a|% Length
Que pode ser reduzido com caracteres curinga. O curinga deve ser resolvido para uma única propriedade (ou método, mais sobre isso posteriormente), para gerar um erro útil, caso contrário, indicando exatamente para quais membros ele poderia resolver.
No caso de Length
, Le*
normalmente é o mais curto. Mesmo em uma única sequência, esse método é 1 byte menor do que apenas usar a propriedade
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Mas, dependendo do que você está fazendo com isso, isso pode ser pior. Você pode fazer $a.Length*5
isso apenas com a expressão de pipeline que precisaria envolvê-la ($a|% Le*)*5
; ainda pode valer a pena se for contra uma matriz, mas o ponto é que nem sempre é apropriado como uma substituição direta.
Também funciona com métodos, e você pode deixar de fora o ()
que cria um nome completo com o mesmo comprimento, mas com a mesma restrição acima, às vezes tendo que envolvê-lo. O método deve ter uma sobrecarga que não requer parâmetros (você pode passar argumentos colocando-os após o nome do método, o que é muito bom):
$a.ToUpper() # 12
$a|% *per # 9
Com argumentos:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Eles não são estritamente os mesmos, pois o -replace
operador substitui uma regex, mas se você estiver apenas substituindo uma sequência, pode (agora) ser mais curto para usar o método; ajuda que as strings sejam argumentos de cmdlet em vez de argumentos de método, para que não precisem ser citadas.
Propriedades Where-Object
?
também pode usar nomes de propriedade (parciais) e aplicar um "operador" a ele (na forma de parâmetros de opção). Novamente, isso pode ser mais curto do que usar a Where-Object
abordagem de scriptblock padrão se o nome da propriedade for suficientemente longo e exclusivo.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs