2011-08-23 15 views
6

में मैं इस Powershell बयान देखा हाल ही में एक Hanselminutes post -

cat test.txt | foreach-object {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x} | sort | get-unique 

मैं इस समय Powershell जानने की कोशिश कर रहा हूँ और मुझे लगता है कि मैं क्या चल रहा है के सबसे को समझने -

  • बयान 'test.txt' की प्रत्येक पंक्ति के माध्यम से लूप और वर्तमान पंक्ति के खिलाफ एक regex चलाता
  • सभी परिणाम collated रहे हैं और फिर अनुसार क्रमबद्ध और डुप्लिकेट
  • हटाया

मेरे समझ बयान के इस हिस्से पर नीचे गिर रहा है -

$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x 
  • '$null =' कोड का हिस्सा क्या कर रहा है, मुझे लगता है यह जब कोई मुकाबला एक परिदृश्य को संभालने के लिए है वापस आ गया है लेकिन मुझे यकीन नहीं है कि यह कैसे काम करता है?
  • क्या $matches.x 'मिले मैचों को वापस कर रहा है?

उत्तर

8

हां, -match ऑपरेटर परिणाम True या False में परिणाम; $null को असाइन करना आउटपुट को दबा देता है।

(?<>) रेगेक्स वाक्यविन्यास एक कैप्चर समूह बनाता है। इस मामले में यह और <.FancyPants> के बीच किसी भी वर्ण के लिए x नामक एक कैप्चर समूह बना रहा है। $matches में अंतिम मैच के लिए मिलान जानकारी शामिल है। कैप्चर समूहों को $matches.CaptureGroupName द्वारा संदर्भित किया जा सकता है।

यहां एक उदाहरण है जिसका उपयोग आप देख सकते हैं कि $Matches चर में क्या है।

'123 Main','456 Broadway'| foreach{$_; $null = $_ -match '(?<MyMatch>\d+)'; ($Matches| ft *)} 

इस उदाहरण में आप मैच के संदर्भ में $Matches.MyMatch का उपयोग करेंगे।

+0

तो '$ match.x' में वर्तमान ऑब्जेक्ट के लिए मैचों शामिल हैं, क्या पीएस स्वचालित रूप से सभी '$ मैचों' परिणाम सेट को एक बड़े परिणाम सेट में जोड़ता है? – ipr101

+0

@ ipr101 नहीं, यह केवल अंतिम मैच रखता है। मैंने अपना उत्तर एक उदाहरण के साथ अपडेट किया है जिसका उपयोग आप '$ Matches' चर में क्या है यह देखने के लिए कर सकते हैं। – Rynant

+0

धन्यवाद जो अब और अधिक समझ में आता है – ipr101

5

'$ null = ...' का उपयोग तुलना के परिणाम को दबाने के लिए किया जाता है। आप की तरह कुछ इसी तरह, देखा हो सकता है:

command | Out-Null 

ऊपर में, बाहर अशक्त cmdlet उत्पादन को दबाने के लिए प्रयोग किया जाता है। कुछ मामलों में आप इसे भी देख सकते हैं:

[void] (...) 

असल में, सभी उदाहरण आउटपुट को अनदेखा करते हुए वही काम करते हैं। यदि आप उपर्युक्त में से किसी एक का उपयोग नहीं करते हैं तो परिणाम पाइपलाइन पर वापस लिखने जा रहा है और आपको पाइपलाइन में कमांड से अप्रत्याशित परिणाम मिल सकते हैं।

+1

यह भी देखें http://stackoverflow.com/questions/5260125/whats-the-better-cleaner-way-to-ignore-output-in-powershell –

+0

धन्यवाद। मुझे इस बारे में पावरशेल टीम (जेम्स ब्रुंडेज से) की एक पोस्ट याद है लेकिन मुझे यह नहीं मिल रहा है। –