2012-10-25 11 views
5

संभव डुप्लिकेट:
What does $_ mean in powershell?

मैं पहले से ही किसी और के question and answer एक ही विषय पर देखा है, लेकिन मेरे लिए यह सवाल का जवाब नहीं है।

मैं कैसे करें-वस्तु, कहाँ-वस्तु, foreach-वस्तु आदि का उपयोग करें और उदाहरण के लिए, में एक स्क्रिप्ट ब्लॉक पारित करने के लिए पता है:

dir | ForEach-Object { $_.Name } 

जो मौजूदा निर्देशिका में सभी फ़ाइल नाम की एक सरणी देता है ।

यह सी # के एक्सटेंशन चुनें विधि के समान है:

Dir.Select(x => x.Name) 

हालांकि, इसके बाद के संस्करण सी # आसानी से समझा जा सकता है क्योंकि हम पद्धति का चयन करें जो तब सूची में प्रत्येक तत्व के लिए यह कार्यान्वित करने के लिए एक समारोह से गुजर रहे हैं।

हालांकि, PowerShell में बराबर:

dir | ForEach-Object { param($x) $x.Name } 

कुछ भी वापस नहीं करता है। हालांकि

& { param($x) $x.Name } (dir)[0] 

अपेक्षा के अनुसार काम करता है।

क्या कोई व्यक्ति सी # से परिचित किसी व्यक्ति को $ _ के जादू को समझा सकता है लेकिन स्क्रिप्टिंग की दुनिया नहीं? यह एक विशेष खोजशब्द है? क्या इसका उपयोग केवल स्क्रिप्ट ब्लॉक में किया जा सकता है जो cmdlets में पारित हो जाते हैं? फॉरएच-ऑब्जेक्ट (या कोई अन्य cmdlet) में एक को पाइप किए बिना आप कैसे आते हैं? i.e:

& { $_.Name } (dir)[0] 

?

+1

के नीचे डेटा पास करने का एक तरीका है, यह किसी अन्य प्रश्न का सटीक डुप्लिकेट नहीं है (जिसे मैंने इस प्रश्न की पहली पंक्ति में कहा था)। * अन्य * प्रश्न अधिक या कम पूछता है कि * इसका उपयोग कैसे करें * नहीं, * मतलब * क्या है। आप बता सकते हैं कि डुप्लिकेट नहीं है क्योंकि स्वीकृत उत्तर अलग हैं। ज़दान के जवाब से पता चलता है कि फ़िल्टर को सीधे कुछ पिप करना संभव है जबकि जेरेडपार का जवाब कुछ के लिए ऑब्जेक्ट को पाइप किया जा रहा है। दोनों के बीच का अंतर सीधे फ़िल्टर को कॉल कर रहा है या फ़िल्टर को दूसरे फिल्टर में पास कर रहा है जो उसके बाद इसे निष्पादित करता है। –

उत्तर

8

$_ केवल एक पाइपलाइन के संदर्भ में बनाया गया है, जो एक आदेश से आउटपुट ऑब्जेक्ट्स को दूसरे के "इनपुट" में गुजर रहा है। पाइपलाइन फ़िल्टर (जो फ़ंक्शंस की तरह हैं) के लिए, पावरलाइन स्वचालित रूप से वैरिएबल को पाइपलाइन के वर्तमान ऑब्जेक्ट के साथ पॉप्युलेट करता है। अब मैं वर्तमान कहता हूं क्योंकि यह ध्यान रखना महत्वपूर्ण है कि जब एकाधिक ऑब्जेक्ट पाइपलाइन को पारित किया जाता है, तो प्रति ऑब्जेक्ट में एक बार आपके फ़िल्टर की प्रक्रिया स्क्रिप्टब्लॉक निष्पादित की जाती है।

अब, आप इनपुट पैरामीटर में से किसी एक को पाइपलाइन ऑब्जेक्ट का नाम बदल सकते हैं, लेकिन आपको शक्तियों को बताना होगा कि आप ऐसा कर रहे हैं। उदाहरण के लिए:

# C:\> filter get-name-filt {Param([parameter(ValueFromPipeline=$true)]$x) $x.name} 
# C:\> (dir)[0] | get-name-filt 

जो कमांड लाइन पर बहुत सुविधाजनक नहीं है, इसलिए $ _ स्वचालित चर।

+0

धन्यवाद यह उत्तर पूरी तरह से बताता है कि $ _ क्या है। –

2

$_ वर्तमान पाइप-लाइन आइटम है।

उदाहरण के लिए:

dir | ForEach-Object { $_.Name } 

मतलब:

  1. भागो dir कमांड
  2. अगले पाइपलाइन आदेश के उत्पादन दर्रा
  3. foreach-वस्तु एक के रूप में dir से उत्पादन का उपयोग करता है परिवर्तनीय $ _

dir के उत्पादन के बाद से संपत्ति .name है तो पाइपलाइन $_ में भी वही संपत्ति होगी। यह पाइप

संबंधित मुद्दे