Rút ngắn tên tài sản
Đáng buồn thay, không giống như các tham số, các thuộc tính / phương thức (bất cứ thứ gì được truy cập bằng dấu chấm .
) thường không thể được rút ngắn xuống dạng không rõ ràng của nó.
Nhưng một số lệnh ghép ngắn nhất định có thể hoạt động trên tên thuộc tính và lấy ký tự đại diện, và có các bộ tham số ít được biết đến %
và ?
có thể hữu ích.
Thông thường chúng ta chuyển qua một scriptblock và tham chiếu đến mục này $_
, nhưng có một dạng khác trong số này có tên thuộc tính và nó chấp nhận ký tự đại diện.
$o|select Le*
$o|%{$_.Length}
Với một thuộc tính như .Length
chúng ta không thể sử dụng phép thuật v3 thường hoạt động trên một mảng vì đó Length
là một thuộc tính của chính mảng đó, vì vậy hai thuộc tính trên có thể được sử dụng để lấy độ dài của từng thành viên. Đi select
kèm trong một chút ngắn hơn.
Nhưng %
có thể lấy tên tài sản trực tiếp và trả về giá trị đó:
$a|% Length
Mà có thể được rút ngắn với ký tự đại diện. Ký tự đại diện phải giải quyết thành một thuộc tính (hoặc phương thức, nhiều hơn về sau), vì vậy nó sẽ gây ra lỗi hữu ích nếu không, cho biết chính xác thành viên nào có thể giải quyết.
Trong trường hợp Length
, Le*
thường là ngắn nhất. Ngay cả trên một chuỗi, phương thức này ngắn hơn 1 byte so với chỉ sử dụng thuộc tính.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Nhưng tùy thuộc vào những gì bạn đang làm với điều này, điều này có thể tồi tệ hơn. Bạn có thể làm $a.Length*5
nhưng để làm điều đó với biểu thức đường ống bạn phải bọc nó ($a|% Le*)*5
; có thể vẫn còn giá trị nếu nó chống lại một mảng, nhưng vấn đề là nó không phải lúc nào cũng thích hợp như một sự thay thế thẳng.
Nó cũng hoạt động với các phương thức và bạn có thể bỏ qua cái ()
mà làm cho một tên đầy đủ có cùng độ dài, nhưng hạn chế tương tự như trên về việc đôi khi phải bọc nó. Phương thức phải có quá tải không có tham số (bạn có thể truyền đối số bằng cách đặt chúng sau tên phương thức, điều này thực sự tốt):
$a.ToUpper() # 12
$a|% *per # 9
Với các đối số:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Chúng không hoàn toàn giống nhau ở chỗ -replace
toán tử thực hiện thay thế regex, nhưng nếu bạn chỉ thực hiện thay thế chuỗi, thì có thể (bây giờ) ngắn hơn để sử dụng phương thức; nó giúp các chuỗi là các đối số cmdlet thay vì các đối số phương thức để chúng không cần được trích dẫn.
Thuộc tính đối tượng
?
cũng có thể lấy (một phần) tên thuộc tính và áp dụng "toán tử" cho nó (dưới dạng tham số chuyển đổi). Một lần nữa, điều này có thể ngắn hơn so với sử dụng cách Where-Object
tiếp cận scriptblock tiêu chuẩn nếu tên thuộc tính đủ dài và duy nhất.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs