PowerShell: वैरिएबल में संपूर्ण पाठ फ़ाइल सामग्री संग्रहीत करें


118

मैं एक चर में एक पाठ फ़ाइल (अनुगामी रिक्त पंक्ति जो मौजूद हो सकती है या नहीं हो सकती है सहित) की संपूर्ण सामग्री को संग्रहीत करने के लिए PowerShell का उपयोग करना चाहता हूं । मैं पाठ फ़ाइल में कुल पंक्तियों को जानना चाहूंगा। ऐसा करने का सबसे कुशल तरीका क्या है?

जवाबों:


122

किसी फ़ाइल की संपूर्ण सामग्री प्राप्त करने के लिए:

$content = [IO.File]::ReadAllText(".\test.txt")

लाइनों की संख्या:

([IO.File]::ReadAllLines(".\test.txt")).length

या

(gc .\test.ps1).length

हैकिंग की छंटनी में खाली लाइन को शामिल करना शामिल है:

[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count

1
धन्यवाद! $content = [IO.File]::ReadAllText(".\test.txt")के रूप में एक ही बात करने के लिए प्रकट होता है $content = (gc ".\test.txt" | out-string)। चूंकि दोनों में से दूसरा छोटा है, इसलिए मैं यही पसंद करता हूं। दुर्भाग्य से, कुल पंक्तियों की गणना के लिए आपके द्वारा दिए गए तरीकों में से कोई भी खाली लाइनों को ध्यान में नहीं लेता है। कोई अन्य विचार?
Nick

@Nick .Net (और विंडोज़) के साथ किसी भी लाइन को \r\nगिना जाएगा।
मनोज् यों

मैं कुछ प्रयोग कर रहा था और आपके अपडेट किए गए उत्तर के समान ही आया, लेकिन मैं आपकी मदद के बिना वहां नहीं जा सकता था, इसलिए आपको बहुत धन्यवाद!
निक '

क्या इसे पारदर्शी रूप से संयोजित करने का कोई तरीका है Invoke-WebRequest?
करीम

189

एक साइड नोट पर, PowerShell 3.0 में आप Get-Contentनए रॉ स्विच के साथ cmdlet का उपयोग कर सकते हैं :

$text = Get-Content .\file.txt -Raw 

3
यह स्वीकृत उत्तर होना चाहिए। वैसे, मुझे पूरा यकीन है कि गेट-कंटेंट पहले के संस्करणों में भी काम करता है।
'12

10
@MatteoSp Get-Contentने किया, लेकिन यह 3.0 तक नहीं था जो इसे मिला -Raw। इसके बिना, यह एक पंक्ति के रूप में संग्रहीत हो जाता है।
jpmc26

यह बिल्कुल स्वीकृत उत्तर होना चाहिए। यह मदद नहीं करता है कि प्रलेखन का कहना है कि -Rawपैरामीटर कुछ भी देशी द्वारा लागू नहीं किया गया है।
रिचर्ड स्ज़ले

धन्यवाद, यह अभी एक बड़ी मदद थी।
डेहरेंस

24

पॉवर्सशेल 2.0:

(विस्तृत विवरण यहां देखें)

$text = Get-Content $filePath | Out-String

IO.File.ReadAllTextएक रिश्तेदार पथ के साथ मेरे लिए काम नहीं किया, उस में फ़ाइल के लिए लग रहा है %USERPROFILE%\$filePathके बजाय वर्तमान निर्देशिका का (जब कम से कम Powershell आईएसई से चल):

$text = [IO.File]::ReadAllText($filePath)

शक्तियों 3+:

$text = Get-Content $filePath -Raw

रिश्तेदारों रास्तों का उपयोग करने के लिए, इसे पहले हल करें:[IO.File]::ReadAllText((Resolve-Path $filePath))
mvanle

13

फ़ाइल को पढ़ने के लिए एक और तरीका जो मुझे पसंद है, उसे विभिन्न रूप से परिवर्तनीय संकेतन या चर सिंटैक्स के रूप में संदर्भित किया जाता है और इसमें एक डॉलर चिह्न द्वारा पूर्व में घुसे घुंघराले ब्रेसिज़ के भीतर एक बुद्धि को संलग्न करना शामिल है, बुद्धि के लिए:

$content = ${C:file.txt}

इस संकेतन का उपयोग एल-मान या आर-मान के रूप में किया जा सकता है ; इस प्रकार, आप बस कुछ इस तरह से आसानी से एक फ़ाइल में लिख सकते हैं:

 ${D:\path\to\file.txt} = $content

एक और उपयोगी उपयोग यह है कि आप एक अस्थायी फ़ाइल के बिना और उप-अभिव्यक्तियों के बिना एक फ़ाइल को संशोधित कर सकते हैं, उदाहरण के लिए:

${C:file.txt} = ${C:file.txt} | select -skip 1

मैं शुरू में इस धारणा से रोमांचित हो गया क्योंकि इसके बारे में कुछ भी पता लगाना बहुत मुश्किल था! यहां तक ​​कि पॉवरशेल 2.0 विनिर्देश में केवल एक बार इसका उपयोग करते हुए केवल एक पंक्ति दिखाने का उल्लेख है - लेकिन इसका कोई विवरण या उपयोग का विवरण नहीं है। मैंने बाद में इस ब्लॉग प्रविष्टि को PowerShell चर पर पाया है जो कुछ अच्छी जानकारी देता है।

इसका उपयोग करने पर एक अंतिम नोट: आपको ड्राइव पदनाम का उपयोग करना होगा, ${drive:filespec}जैसा कि मैंने ऊपर दिए गए सभी उदाहरणों में किया है। ड्राइव के बिना (जैसे ${file.txt}) यह काम नहीं करता है। उस ड्राइव पर फाइलस्पेस पर कोई प्रतिबंध नहीं: यह निरपेक्ष या सापेक्ष हो सकता है।


मुझे यह काम करने के लिए कभी नहीं मिला जब तक कि मैंने ड्राइव नाम के बाद बैकस्लैश नहीं लगाया।
चार्ल्स एंडरसन

@CharlesAnderson: यह स्पष्ट नहीं है कि आप जिन तीन उदाहरणों का उल्लेख कर रहे हैं, या उनमें से शायद सभी ... फिर भी, मैंने अभी पुष्टि की है कि सभी 3 PowerShell 3 में एक रिश्तेदार पथ (यानी कोई बैकस्लैश) के साथ काम नहीं करते हैं। इसके अलावा, मेरे जवाब के समय मैं V2 का उपयोग कर रहा था, इसलिए शायद आपके वातावरण में समस्या पैदा करने के लिए कुछ और है।
माइकल सोरेंस

मेरा मतलब $ {C: file.txt} जैसे उदाहरण हैं, जिन्हें मुझे $ {C: \ file.txt} के रूप में लिखना है। हां, मुझे लगता है कि यह मेरे पर्यावरण के बारे में कुछ है, लेकिन मुझे नहीं पता कि क्या है।
चार्ल्स एंडरसन

एल-मूल्य के रूप में उपयोग करते समय, यह सिस्टम के डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है। मैंने $ OutputEncoding को बिना किसी प्रभाव के सेट करने का प्रयास किया। आर-मान के रूप में उपयोग करते समय, यह एक स्ट्रिंग [] सरणी का उत्पादन करता है।
रोबर्ट 4

ऐसा लगता है कि आप केवल शाब्दिक पथनाम का उपयोग कर सकते हैं; आप इसके अंदर एक Join-Path एक्सप्रेशन जैसे एक वैरिएबल या कुछ का उपयोग नहीं कर सकते हैं। जो कष्टप्रद है, क्योंकि जब ConvertTo-Json के माध्यम से पाइप किया जाता है, तो गेट-कंटेंट (और $ {...} परिणाम के साथ तुलना में अंतर की एक दुनिया है जो मैं उम्मीद कर रहा था। मुझे यकीन नहीं है कि यह वही है। as-Get-Content | आउट-स्ट्रिंग हालांकि
कैमरून केर

2

गेट-कंटेंट डेटा को पकड़ लेता है और इसे एक सरणी में, लाइन द्वारा लाइन में डंप करता है। मान लें कि आपके द्वारा सूचीबद्ध अन्य विशेष आवश्यकताएं नहीं हैं, तो आप अपनी सामग्री को एक चर में सहेज सकते हैं?

$file = Get-Content c:\file\whatever.txt

बस चलाने $fileसे पूरी सामग्री वापस आ जाएगी। तब आप बस $file.Count# कुल लाइनों को प्राप्त करने के लिए (क्योंकि सरणियों में पहले से ही एक गणना पद्धति निर्मित है) कर सकते हैं।

उम्मीद है की यह मदद करेगा! मैं स्क्रिप्टिंग वाइज़ नहीं हूं, लेकिन ऊपर के बहुत सारे सामानों की तुलना में यह मुझे आसान लग रहा था।

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