Memperpendek Nama Properti
Sayangnya, tidak seperti parameter, properti / metode (apa pun yang diakses dengan titik .
) biasanya tidak dapat disingkat menjadi bentuk yang tidak ambigu.
Tetapi cmdlet tertentu dapat beroperasi pada nama properti dan mengambil wildcard, dan ada set parameter yang sedikit diketahui %
dan ?
yang dapat berguna.
Biasanya kami meneruskan blokir skrip dan merujuk ke item dengan $_
, tetapi ada bentuk lain dari ini yang mengambil nama properti, dan menerima wildcard.
$o|select Le*
$o|%{$_.Length}
Dengan properti seperti .Length
kita tidak dapat menggunakan sihir v3 yang biasanya bekerja pada array karena Length
merupakan properti dari array itu sendiri, sehingga dua di atas dapat digunakan untuk mendapatkan panjang anggota individu. The select
datang dalam sedikit memagut lebih pendek.
Tetapi %
dapat mengambil nama properti secara langsung dan mengembalikan nilai itu:
$a|% Length
Yang bisa disingkat dengan wildcard. Wildcard harus menyelesaikan ke satu properti (atau metode, lebih lanjut tentang itu nanti), jadi itu akan melemparkan kesalahan bermanfaat jika tidak, menunjukkan dengan tepat anggota mana yang bisa diatasi.
Dalam kasus Length
, Le*
biasanya yang terpendek. Bahkan pada string tunggal, metode ini lebih pendek 1 byte daripada hanya menggunakan properti.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Tetapi tergantung pada apa yang Anda lakukan dengan ini, ini bisa lebih buruk. Anda dapat melakukannya $a.Length*5
selain melakukannya dengan ekspresi pipeline yang harus Anda bungkus ($a|% Le*)*5
; mungkin masih layak jika itu melawan array, tapi intinya itu tidak selalu tepat sebagai pengganti langsung.
Ini bekerja dengan metode juga, dan Anda dapat meninggalkan ()
yang membuat nama lengkap dengan panjang yang sama, tetapi pembatasan yang sama seperti di atas tentang kadang-kadang harus membungkusnya. Metode ini harus memiliki kelebihan yang tidak memerlukan parameter (Anda dapat melewatkan argumen dengan menempatkannya setelah nama metode, yang sangat bagus):
$a.ToUpper() # 12
$a|% *per # 9
Dengan argumen:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Ini tidak sepenuhnya sama di mana -replace
operator melakukan penggantian regex, tetapi jika Anda hanya melakukan penggantian string, itu bisa (sekarang) lebih pendek untuk menggunakan metode ini; ini membantu bahwa string adalah argumen cmdlet bukan argumen metode sehingga tidak perlu dikutip.
Properties Dimana-Obyek
?
dapat mengambil (sebagian) nama properti juga, dan menerapkan "operator" untuk itu (dalam bentuk parameter sakelar). Sekali lagi ini bisa lebih pendek daripada menggunakan Where-Object
pendekatan standar scriptblock jika nama properti cukup panjang dan unik.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs