जवाबों:
यह पाइप लाइन में वर्तमान मूल्य के लिए चर है, जिसे $PSItem
पॉवर्सशेल 3 और नए में कहा जाता है।
1,2,3 | %{ write-host $_ }
या
1,2,3 | %{ write-host $PSItem }
उदाहरण के लिए उपरोक्त कोड %{}
में ऐरे में प्रत्येक मान के लिए ब्लॉक कहा जाता है। $_
या $PSItem
चर वर्तमान मूल्य शामिल होंगे।
ForEach-Object
या Where-Object
आप इसे किसी चीज़ में उपयोग नहीं कर सकते हैं जैसे Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- इसमें एक पाइपलाइन शामिल है, लेकिन कोई स्क्रिप्ट ब्लॉक नहीं है और इसलिए नहीं $_
। (यह कहा जा रहा है, PowerShell मदद भी पाइपलाइन के लिए संदर्भित करता है $_
। भ्रमित करना।)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
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
मुझे लगता है कि इस चर के बारे में सोचने का सबसे आसान तरीका इनपुट पैरामीटर के रूप में लैम्ब्डा अभिव्यक्ति में सी # है। Ie C # में अनाम फ़ंक्शन के $_
समान है । निम्नलिखित उदाहरणों पर विचार करें:x
x => 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
_
में लैम्बडा में इनपुट पैरामीटर के रूप में उपयोग न करें । _
कभी-कभी जब मापदंडों की अनदेखी की जाती है, तो इसके बजाय x का उपयोग करें। stackoverflow.com/questions/424775/…
इस वेबसाइट के अनुसार , यह एक संदर्भ है this
, ज्यादातर छोरों में।
$ _ (डॉलर अंडरस्कोर) 'THIS' टोकन। आमतौर पर एक फ़ॉरच लूप के अंदर आइटम को संदर्भित करता है। कार्य: एक संग्रह में सभी आइटम मुद्रित करें। उपाय। ... | foreach {लिखें-होस्ट $ _}
this
$_
चर के लिए एक भ्रमित करने वाला शब्द है । ओओपी में यह आम तौर पर वर्ग को संदर्भित करता है, न कि एक चर को।
$ _ स्वचालित चर $ PSItem के लिए एक उपनाम है (PowerShell V3.0 में पेश किया गया है; यहां दी गई जानकारी का उपयोग करें ) जो पाइप से वर्तमान आइटम का प्रतिनिधित्व करता है।
PowerShell (v6.0) स्वचालित चर के लिए ऑनलाइन दस्तावेज़ यहाँ है ।
$_
आमतौर पर ब्लॉक अभिव्यक्तियों के अंदर सिस्टम द्वारा बनाया गया एक चर है जिसे cmdlets द्वारा संदर्भित किया जाता है जो पाइप जैसे Where-Object
और के साथ उपयोग किया जाता है ForEach-Object
।
लेकिन इसका उपयोग अन्य प्रकार के अभिव्यक्तियों में भी किया जा सकता है, उदाहरण के लिए Select-Object
अभिव्यक्ति गुणों के साथ संयुक्त। Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
। इस मामले में $_
आइटम को पाइप किए जाने का प्रतिनिधित्व करता है, लेकिन कई भाव मौजूद हो सकते हैं।
यह कस्टम पैरामीटर सत्यापन द्वारा भी संदर्भित किया जा सकता है, जहां एक मान को मान्य करने के लिए स्क्रिप्ट ब्लॉक का उपयोग किया जाता है। इस मामले $_
में मंगलाचरण से प्राप्त पैरामीटर मान का प्रतिनिधित्व करता है।
C # और java की निकटतम सादृश्य लामदा अभिव्यक्ति है। यदि आप मूल बातें के लिए शक्तियां तोड़ते हैं तो सब कुछ एक स्क्रिप्ट ब्लॉक है जिसमें एक स्क्रिप्ट फ़ाइल ए, फ़ंक्शन और cmdlets शामिल हैं। आप अपने स्वयं के मापदंडों को परिभाषित कर सकते हैं लेकिन कुछ अवसरों में आपके लिए सिस्टम द्वारा एक बनाया जाता है जो प्रक्रिया / मूल्यांकन के लिए इनपुट आइटम का प्रतिनिधित्व करता है । उन स्थितियों में स्वचालित चर है $_
।