संपत्ति का नाम छोटा करना
अफसोस की बात है कि मापदंडों के विपरीत, गुण / विधियां (डॉट के साथ एक्सेस की गई कोई भी चीज .
) आमतौर पर इसके अस्पष्ट रूप से कम नहीं की जा सकती है।
लेकिन कुछ cmdlets प्रॉपर्टी के नाम पर काम कर सकते हैं और वाइल्डकार्ड ले सकते हैं, और इसके बहुत कम ज्ञात पैरामीटर सेट हैं %
और ?
यह उपयोगी हो सकते हैं।
आमतौर पर हम एक स्क्रिप्टब्लॉक में पास होते हैं और आइटम को संदर्भित करते हैं $_
, लेकिन इनमें से एक और रूप है जो एक संपत्ति का नाम लेता है, और यह एक वाइल्डकार्ड स्वीकार करता है।
$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
ऑपरेटर रिप्जेक्स को प्रतिस्थापित करता है, लेकिन यदि आप एक स्ट्रिंग को प्रतिस्थापित कर रहे हैं, तो यह (अब) विधि का उपयोग करने के लिए कम हो सकता है; यह मदद करता है कि तार विधि तर्कों के बजाय cmdlet तर्क हैं, इसलिए उन्हें उद्धृत करने की आवश्यकता नहीं है।
जहाँ-जहाँ गुण
?
के रूप में अच्छी तरह से (आंशिक) संपत्ति नाम ले सकते हैं, और इसे (स्विच मापदंडों के रूप में) एक "ऑपरेटर" लागू कर सकते हैं। Where-Object
यदि संपत्ति का नाम पर्याप्त रूप से लंबा और अनूठा है, तो फिर से यह मानक स्क्रिप्टब्लॉक दृष्टिकोण का उपयोग करने से कम हो सकता है ।
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs