2009-09-30 16 views
15

के साथ स्ट्रिंग नहीं है, मैं किसी विशेष स्ट्रिंग के लिए अपने स्रोत कोड को "grep" करने के लिए powerhell का उपयोग कर रहा हूं। यदि स्ट्रिंग फ़ाइल में है, तो मुझे फ़ाइल का नाम चाहिए, न कि स्ट्रिंग वाले कोड की रेखा।आउटपुट फ़ाइल नाम, चयन-स्ट्रिंग

मुझे फ़ाइल का नाम भी पसंद आएगा, बस एक बार, फ़ाइल मौजूद होने के साथ-साथ कई बार सूचीबद्ध नहीं होगा।

मैं वर्तमान में उपयोग कर रहा हूँ:

gci . -include "*.sql" -recurse | select-string -pattern 'someInterestingString' 

अब मैं समझता हूँ कि चयन स्ट्रिंग के उत्पादन ojbect किसी प्रकार का है, और क्या मैं कंसोल में दिखाई दे रही है है, मैं, अनुमान लगा रहा हूँ उस वस्तु के ToString()। मुझे लगता है कि मैं चयन-स्ट्रिंग के आउटपुट को नियंत्रित करने के लिए format-table का उपयोग कर सकता हूं, और मुझे लगता है कि केवल sort विशिष्ट मान प्राप्त करने के लिए।

लेकिन यह बहुत अनुमान है।

उत्तर

32

मुझे नहीं लगता कि मैं पूरी तरह समझता हूं कि आप क्या करने की कोशिश कर रहे हैं। आप -GroupBy पैरामीटर के साथ आउटपुट फ़ाइल के आधार पर वर्गीकृत, Format-Table में पाइप कर सकते हैं चाहते हैं:

gci . -include "*.sql" -recurse ` 
    | select-string -pattern 'someInterestingString' ` 
    | Format-Table -GroupBy Path 

आप फ़ाइलों को किसी अन्य जानकारी के बिना मेल खाते का केवल नाम प्राप्त करना चाहते हैं, तो आप के साथ Select-Object उपयोग कर सकते हैं -Unique पैरामीटर:

gci . -include "*.sql" -recurse ` 
    | select-string -pattern 'someInterestingString' ` 
    | Select-Object -Unique Path 

आप केवल फ़ाइल नाम में रुचि रखते हैं, भले ही नाम ही अपने पदानुक्रम में कई बार दिखाई देता है, तो आप Filename संपत्ति बजाय चुन सकते हैं।


नोट:

gci . -include "*.sql" -recurse ` 
    | select-string -pattern 'someInterestingString' ` 
    | Get-Member 

तुम भी बजाय अपने उर्फ ​​gm उपयोग कर सकते हैं: Get-Member cmdlet पता लगाना क्या गुण एक वस्तु पर मौजूद में एक बहुत मदद करता है।

+0

यह बिल्कुल विस्तृत उत्तर है जिसे मैं ढूंढ रहा था। धन्यवाद! –

13

मैं इस जब कर रहा हूँ मैं सिर्फ -List पैरामीटर का उपयोग - हाँ यह कोड की पंक्ति को प्रदर्शित करता है, लेकिन आप केवल फ़ाइल प्रति एक लाइन प्राप्त (कोई बात नहीं देखते हैं कितने मैचों):

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list 

Commands\SnapinHelp\CmdletInfo.cs:27:  public List<XmlNode> InputTypes; 
Commands\SnapinHelp\GetSnapinHelpCommand.cs:124:   WriteXmlNodeList(c... 
Commands\SnapinHelp\ParameterInfo.cs:73:  XmlNode FindNode(XmlDocument doc) 
Commands\Xml\XmlCommandBase.cs:65:   RegisterInputType<XmlNode>(Proce... 

आप पथ चाहते हैं:

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list | 
    Format-Table Path 

Path 
-------- 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\CmdletInfo.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\GetSnapinHelpCommand.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\ParameterInfo.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\Xml\XmlCommandBase.cs 

या आप वास्तव में केवल फ़ाइल नाम चाहते हैं:

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list | 
    Format-Table Filename 

Filename 
-------- 
CmdletInfo.cs 
GetSnapinHelpCommand.cs 
ParameterInfo.cs 
XmlCommandBase.cs 
+2

उपरोक्त (अधिक सामान्य) समाधान से बहुत आसान है ... +1। –

+1

इस दृष्टिकोण के लिए केवल नीचे की तरफ यह है कि यदि बाइनरी फाइल खोज पथ में हैं तो पहली पंक्ति शायद पूरी फ़ाइल हो सकती है। – Tolga

+0

@ टोल्गा बाइनरी को हटाने के लिए, बस '-exclude * .dll, * .pdb, * .cache, * .exe' ** get-childitem **, या दिखाई देने वाले किसी अन्य बाइनरी एक्सटेंशन का उपयोग करें। – SliverNinja

1

मैं

(...|select-string "search").Path 
+0

यह काम करता है, लेकिन फ़ाइल में स्ट्रिंग के लिए खोजे जाने पर प्रत्येक बार फ़ाइल के पथ को वापस कर देगा। – Rod

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