PowerShell में $ _ का क्या अर्थ है?


226

मैंने PowerShell में निम्नलिखित को बहुत देखा है, लेकिन यह वास्तव में क्या करता है?

$_

5
प्रश्न, निश्चित रूप से, दिए गए एकल विशेष टोकन के लिए उत्तर दिया गया है, लेकिन पावरशेल के सभी विशेष टोकन के चित्रण के लिए एक दीवारचट के लिए , संपूर्ण गाइड को पावरशेल विराम चिह्न
माइकल सोरेंस

जवाबों:


171

यह पाइप लाइन में वर्तमान मूल्य के लिए चर है, जिसे $PSItemपॉवर्सशेल 3 और नए में कहा जाता है।

1,2,3 | %{ write-host $_ } 

या

1,2,3 | %{ write-host $PSItem } 

उदाहरण के लिए उपरोक्त कोड %{}में ऐरे में प्रत्येक मान के लिए ब्लॉक कहा जाता है। $_या $PSItemचर वर्तमान मूल्य शामिल होंगे।


42
यह आवश्यक रूप से पाइपलाइन से संबंधित नहीं है। यह "वर्तमान में स्क्रिप्ट ब्लॉक को निष्पादित करने का वर्तमान तर्क" अधिक है। उदाहरण के लिए जब आप इसे ठीक-ठीक उपयोग कर सकते हैं ForEach-Objectया Where-Objectआप इसे किसी चीज़ में उपयोग नहीं कर सकते हैं जैसे Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)- इसमें एक पाइपलाइन शामिल है, लेकिन कोई स्क्रिप्ट ब्लॉक नहीं है और इसलिए नहीं $_। (यह कहा जा रहा है, PowerShell मदद भी पाइपलाइन के लिए संदर्भित करता है $_। भ्रमित करना।)
जॉय

@ जॉय आप बिलकुल अपने उदाहरण में $ _ का उपयोग कर सकते हैं। Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous

@Xalorous: सिर्फ इसलिए कि यह एक त्रुटि पैदा नहीं करता है इसका मतलब यह नहीं है कि यह काम करता है: Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar... ठीक है, यह काम कर सकता है यदि आपके पास $_उस दायरे में है जहां आप उस पाइपलाइन को निष्पादित कर रहे हैं। लेकिन यह बहुत अलग है कि आप आमतौर पर जब ऐसा कुछ लिखने की कोशिश करते हैं तो इसका मतलब क्या होता है।
जॉय

@ $_जो आपने लिखा है, किसी कारण से, सभी वस्तुओं के माध्यम से नहीं। इसके बजाय यह प्रयास करें। gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar। मुझे संदेह है कि gci | cmdletस्पष्ट फॉर्च्यूनर के बिना जीसीआई परिणाम इकट्ठा हो रहा है और सेमीडलेट के लिए एक सरणी पास कर रहा है। हालाँकि, सरणी एक ऑब्जेक्ट है, इसलिए यह सरणी ऑब्जेक्ट में एक संपत्ति जोड़ रहा है। सरणी में 'नाम' गुण नहीं है, इसलिए $ _ बार को निर्दिष्ट मान $ null है। निचला रेखा यह है कि $ _ का उपयोग बड़े पैमाने पर w / पाइपलाइनिंग के लिए किया जाता है। के माध्यम से पाश करने के लिए% {} की आवश्यकता नहीं है नया है।
ज़ालोरस

अतिरिक्त पाइपलाइन के साथ काम करने का संस्करण हटा दिया गया। gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous

37

मुझे लगता है कि इस चर के बारे में सोचने का सबसे आसान तरीका इनपुट पैरामीटर के रूप में लैम्ब्डा अभिव्यक्ति में सी # है। Ie C # में अनाम फ़ंक्शन के $_समान है । निम्नलिखित उदाहरणों पर विचार करें:xx => Console.WriteLine(x)

शक्ति कोशिका:

1,2,3 | ForEach-Object {Write-Host $_}

प्रिंटों:

1
2
3

या

1,2,3 | Where-Object {$_ -gt 1}

प्रिंटों:

2
3

और LINQ का उपयोग करके C # सिंटैक्स के साथ इसकी तुलना करें:

var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));

प्रिंटों:

1
2
3

या

list.Where( _ => _ > 1)
    .ToList()
    .ForEach(s => Console.WriteLine(s));

प्रिंटों:

2
3

6
C # _में लैम्बडा में इनपुट पैरामीटर के रूप में उपयोग न करें । _कभी-कभी जब मापदंडों की अनदेखी की जाती है, तो इसके बजाय x का उपयोग करें। stackoverflow.com/questions/424775/…
कार्लोस म्यूनोज़

28

इस वेबसाइट के अनुसार , यह एक संदर्भ है this, ज्यादातर छोरों में।

$ _ (डॉलर अंडरस्कोर) 'THIS' टोकन। आमतौर पर एक फ़ॉरच लूप के अंदर आइटम को संदर्भित करता है। कार्य: एक संग्रह में सभी आइटम मुद्रित करें। उपाय। ... | foreach {लिखें-होस्ट $ _}


3
this$_चर के लिए एक भ्रमित करने वाला शब्द है । ओओपी में यह आम तौर पर वर्ग को संदर्भित करता है, न कि एक चर को।
o

1
@remco विशेष रूप से जब PS v5 वर्गों में उपयोग के लिए एक $ इस चर जोड़ता है।
Xalorous

5

$ _ स्वचालित चर $ PSItem के लिए एक उपनाम है (PowerShell V3.0 में पेश किया गया है; यहां दी गई जानकारी का उपयोग करें ) जो पाइप से वर्तमान आइटम का प्रतिनिधित्व करता है।

PowerShell (v6.0) स्वचालित चर के लिए ऑनलाइन दस्तावेज़ यहाँ है


1

$ _ एक चर है जो पिछले से पारित प्रत्येक वस्तु / तत्व से अधिक है (पाइप)।


1

$_आमतौर पर ब्लॉक अभिव्यक्तियों के अंदर सिस्टम द्वारा बनाया गया एक चर है जिसे cmdlets द्वारा संदर्भित किया जाता है जो पाइप जैसे Where-Objectऔर के साथ उपयोग किया जाता है ForEach-Object

लेकिन इसका उपयोग अन्य प्रकार के अभिव्यक्तियों में भी किया जा सकता है, उदाहरण के लिए Select-Objectअभिव्यक्ति गुणों के साथ संयुक्त। Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}। इस मामले में $_आइटम को पाइप किए जाने का प्रतिनिधित्व करता है, लेकिन कई भाव मौजूद हो सकते हैं।

यह कस्टम पैरामीटर सत्यापन द्वारा भी संदर्भित किया जा सकता है, जहां एक मान को मान्य करने के लिए स्क्रिप्ट ब्लॉक का उपयोग किया जाता है। इस मामले $_में मंगलाचरण से प्राप्त पैरामीटर मान का प्रतिनिधित्व करता है।

C # और java की निकटतम सादृश्य लामदा अभिव्यक्ति है। यदि आप मूल बातें के लिए शक्तियां तोड़ते हैं तो सब कुछ एक स्क्रिप्ट ब्लॉक है जिसमें एक स्क्रिप्ट फ़ाइल ए, फ़ंक्शन और cmdlets शामिल हैं। आप अपने स्वयं के मापदंडों को परिभाषित कर सकते हैं लेकिन कुछ अवसरों में आपके लिए सिस्टम द्वारा एक बनाया जाता है जो प्रक्रिया / मूल्यांकन के लिए इनपुट आइटम का प्रतिनिधित्व करता है । उन स्थितियों में स्वचालित चर है $_

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.