Скорочення імен властивостей
На жаль, на відміну від параметрів, властивості / методи (все, до чого звертається з крапкою .
) зазвичай не можуть бути скорочені до однозначної форми.
Але деякі командлети можуть працювати на іменах властивостей та отримувати групові символи, і є маловідомі набори параметрів з %
і ?
які можуть бути корисні.
Зазвичай ми передаємо в блоці сценаріїв і посилаємося на елемент з $_
, але є інша форма, яка має ім'я властивості, і він приймає підстановку.
$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
ScriptBlock підходу , якщо ім'я властивості досить довго і унікальні.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs