2010-04-20 11 views
16

का उपयोग करते समय लाइन ब्रेक से बचें, मैं लिख रहा हूं कि मैं एक छोटी पावरशेल स्क्रिप्ट पर थोड़ा निराश हो रहा हूं।आउट-फाइल

मूल रूप से मैं नियमित अभिव्यक्ति पैटर्न की सरणी के खिलाफ प्रत्येक पंक्ति को जांचने के लिए टेक्स्ट फ़ाइलों के माध्यम से लूप करता हूं। परिणाम आउट-फाइल cmdlet पर पाइप हो जाता है जो इसे किसी अन्य टेक्स्ट फ़ाइल में जोड़ता है।

Get-ChildItem $logdir -Recurse -Include @('*.txt') | Get-Content | ForEach-Object { 
Select-String $patterns -InputObject $_ | Out-File $csvpath -Append -Width 1000 } 

मेरे समस्या यह है कि मैं बाहर फ़ाइल को छोड़ करने के लिए उन अतिरिक्त लाइन यह $ csvpath पीछे फ़ाइल (तीन प्रत्येक पंक्ति के बाद) में पैदा करता है टूट जाता है नहीं मिल सकता है। मैं एक ही चीज़ को प्राप्त करने के लिए .NET फ्रेमवर्क कक्षाओं का उपयोग कर सकता हूं लेकिन मैं शुद्ध पावरशेल से चिपकना चाहता हूं ;-)

किसी भी मदद की बहुत सराहना की जाती है।

केविन

+2

'foreach {Select-string -InputObject $ _}'? क्यों न केवल 'चयन-स्ट्रिंग' में पाइप? – Joey

+0

हाय जोहान्स, ईमानदार होने के लिए, मुझे नहीं पता कि यह कैसे मदद कर सकता है। – bitfrickler

+0

यह आपकी समस्या का कोई जवाब नहीं था (इसलिए आपके प्रश्न पर टिप्पणी और * कोई जवाब नहीं); सिर्फ एक नोट है कि आप अपने आदेश में अव्यवस्था को कैसे कम कर सकते हैं। – Joey

उत्तर

9

तुम क्यों Add-Content का उपयोग नहीं करते के लिए लाइन संपत्ति उत्पादन करना चाहते हैं?

gci $logdir -rec *.txt | gc | select-string $pattern | add-content $csvpath 

आप चौड़ाई और -append स्विच निर्दिष्ट करने की आवश्यकता नहीं है, फ़ाइल आकार डिफ़ॉल्ट रूप से दोगुनी नहीं है (हालांकि आप एन्कोडिंग निर्दिष्ट कर सकते हैं) और ऐसा लगता है कि वहाँ खाली लाइनों के साथ कोई समस्या नहीं है कि जैसे तुम हो ।

+0

मदद करने में खुशी हुई;) यह काम करता है, लेकिन आम तौर पर कुछ वस्तुओं को प्रारूपित करना मुश्किल हो सकता है। इस मामले में मुझे लगता है कि प्रत्येक 'MatchInfo' ऑब्जेक्ट पर 'ToString()' कहा जाता है। कई अन्य प्रकारों के लिए 'ToString() 'केवल एक प्रकार का नाम देता है (कोई उपयोगी जानकारी नहीं)। तब इसकी आवश्यकता होती है क्योंकि कीथ ठोस संपत्ति निर्दिष्ट करने का सुझाव देता है। – stej

10

ध्यान रखें कि चयन-स्ट्रिंग आउटपुट MatchInfo वस्तुओं और तार नहीं - के रूप में इस आदेश से दिखाया गया है:

gci $logdir -r *.txt | gc | select-string $patterns | format-list * 

आप स्ट्रिंग के लिए MatchInfo वस्तु का एक अंतर्निहित प्रतिपादन के लिए पूछ रहे हैं फाइल करने के लिए आउटपुट होने से पहले। किसी कारण से मुझे समझ में नहीं आ रहा है, इससे आउटपुट होने के लिए अतिरिक्त रिक्त रेखाएं पैदा हो रही हैं। आप निर्दिष्ट करने के द्वारा इसे ठीक कर सकते हैं कि आप केवल फ़ाइल उदा .:

gci $logdir -r *.txt | gc | select-string $patterns | %{$_.Line} | 
    Out-File $csvpath -append -width 1000 
संबंधित मुद्दे