Сокращение названий свойств
К сожалению, в отличие от параметров, свойства / методы (все, что доступно с помощью точки .
) обычно не могут быть сокращены до однозначной формы.
Но некоторые командлеты могут работать на именах свойств и принимать групповые символы, и есть малоизвестные наборы параметров из %
и ?
которые могут быть полезны.
Обычно мы передаем блок скриптов и обращаемся к элементу с помощью $_
, но есть другая форма, которая принимает имя свойства и принимает подстановочный знак.
$o|select Le*
$o|%{$_.Length}
С таким свойством, как .Length
мы, мы не можем использовать магию v3, которая обычно работала бы с массивом, потому что Length
это свойство самого массива, поэтому вышеупомянутые два могут использоваться для получения длин отдельных членов. select
Приходит немного короче.
Но %
может взять имя свойства напрямую и вернуть это значение:
$a|% Length
Который может быть сокращен с подстановочными знаками. Подстановочный знак должен разрешаться в одном свойстве (или методе, подробнее об этом позже), поэтому он выдаст полезную ошибку, если этого не произойдет, с указанием, к каким именно членам он может разрешить.
В случае Length
, Le*
как правило, самый короткий. Даже для одной строки этот метод на 1 байт короче, чем просто использование свойства.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Но в зависимости от того, что вы делаете с этим, это может быть хуже. Вы можете сделать это, $a.Length*5
но сделать это с конвейерным выражением, вам нужно будет обернуть его ($a|% Le*)*5
; может все еще стоить, если он против массива, но дело в том, что это не всегда уместно в качестве прямой замены.
Он работает и с методами, и вы можете не ()
указывать полное имя, которое имеет ту же длину, но те же ограничения, что и выше, о необходимости иногда оборачивать его. Метод должен иметь перегрузку, которая не принимает параметров (вы можете передавать аргументы, помещая их после имени метода, что очень приятно):
$a.ToUpper() # 12
$a|% *per # 9
С аргументами:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Это не совсем то же самое, что -replace
оператор выполняет замену регулярных выражений, но если вы просто заменяете строку, использование (сейчас) может быть короче, если использовать метод; помогает то, что строки являются аргументами командлета, а не аргументами метода, поэтому их не нужно заключать в кавычки.
Свойства где-объекта
?
также может принимать (частичные) имена свойств и применять к ним «оператор» (в форме параметров переключателя). Опять же, это может быть короче, чем использование стандартного Where-Object
подхода к блоку сценариев, если имя свойства достаточно длинное и уникальное.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs