PowerShell सेट-सामग्री और आउट-फ़ाइल - क्या अंतर है?


90

PowerShell में, के बीच क्या फर्क है Out-Fileऔर Set-Content? या Add-Contentऔर Out-File -append?

मैंने पाया है कि अगर मैं एक ही फाइल के खिलाफ दोनों का उपयोग करता हूं, तो पाठ पूरी तरह से mojibaked है

(एक मामूली दूसरा सवाल: >क्या Out-Fileसही के लिए एक उपनाम है ?)

जवाबों:


96

PowerShell के साथ कुछ महीनों के अनुभव और कुछ वैज्ञानिक प्रयोग के बाद, मैंने जो कुछ भी घटाया है उसका सारांश यहां दिया गया है। मैं इस दस्तावेज़ में कभी नहीं मिला :(

[ अद्यतन: इसमें से बहुत कुछ अब बेहतर प्रलेखित प्रतीत होता है।]

पढ़ना और लिखना ताला

जबकि Out-Fileचल रहा है, किसी अन्य अनुप्रयोग लॉग फ़ाइल पढ़ सकते हैं।

जबकि Set-Contentचल रहा है, अन्य अनुप्रयोगों लॉग फ़ाइल नहीं पढ़ सकता। इस प्रकार लंबे चलने वाले कमांड को लॉग करने केSet-Content लिए कभी भी उपयोग न करें

एन्कोडिंग

Out-Fileडिफ़ॉल्ट रूप से Unicode( UTF-16LE) एन्कोडिंग में सहेजता है (हालांकि यह निर्दिष्ट किया जा सकता है), जबकि पावरस्ले 3+ में Set-Contentडिफॉल्ट ASCII( US-ASCII) यह भी निर्दिष्ट किया जा सकता है। पहले के PowerShell संस्करणों Set-Contentमें, Default(ANSI) एन्कोडिंग में सामग्री लिखी थी ।

संपादक का नोट : संस्करण 5.1 के रूप में पावरशेल अभी भी संस्कृति-विशिष्ट Default("एएनएसआई") एन्कोडिंग के लिए चूक है , दस्तावेज़ीकरण के दावे के बावजूद। यदि ASCII डिफ़ॉल्ट थे, तो गैर-ASCII वर्ण जैसे कि शाब्दिक मेंü बदल दिए जाएंगे , लेकिन ऐसा नहीं है: पैदावार । ?'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'$False

PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt

इसका मतलब है कि दो आदेशों की चूक असंगत हैं, और उन्हें मिश्रित करने से पाठ दूषित हो जाएगा, इसलिए हमेशा एन्कोडिंग निर्दिष्ट करें।

का प्रारूपण

जैसा कि बार्टेक ने समझाया, Out-Fileआउटपुट के फैंसी स्वरूपण को बचाता है, जैसा कि टर्मिनल में देखा गया है। इसलिए दो फ़ाइलों वाले फ़ोल्डर में, कमांड dir | out-file out.txt11 लाइनों के साथ एक फ़ाइल बनाता है।

जबकि Set-Contentएक सरल प्रतिनिधित्व बचाता है। दो फ़ाइलों के साथ उस फ़ोल्डर में, कमांड dir | set-content sc.txtदो लाइनों के साथ एक फ़ाइल बनाता है। टर्मिनल में आउटपुट का अनुकरण करने के लिए:

PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt

मेरा मानना ​​है कि इस स्वरूपण का लाइन ब्रेक के लिए एक परिणाम है, लेकिन मैं अभी तक इसका वर्णन नहीं कर सकता।

फ़ाइल निर्माण

Set-Contentमज़बूती से जब कोई खाली फ़ाइल नहीं बनाता है Out-File:

खाली फ़ोल्डर में, कमांड dir | out-file out.txtएक फाइल बनाता है, जबकि dir | set-content sc.txtऐसा नहीं करता है।

पाइप लाइन चर

Set-Contentपाइपलाइन से फ़ाइल नाम लेता है; आपको कुछ निश्चित मान के लिए कई फ़ाइलों की सामग्री सेट करने की अनुमति देता है।

Out-Fileपाइप लाइन से डेटा लेता है; किसी एकल फ़ाइल की सामग्री को अद्यतन करना।

मापदंडों

Set-Content निम्नलिखित अतिरिक्त पैरामीटर शामिल हैं:

  • निकालना
  • फ़िल्टर
  • शामिल
  • से गुजरना
  • धारा
  • UseTransaction

Out-File निम्नलिखित अतिरिक्त पैरामीटर शामिल हैं:

  • संलग्न
  • NoClobber
  • चौड़ाई

उन मापदंडों के बारे में अधिक जानकारी के लिए, कृपया मदद करने के लिए देखें; उदा get-help out-file -parameter append


4
Set-Contentडिफ़ॉल्ट एन्कोडिंग: (Get-Culture).Textinfo.ANSICodePage(Windows 8.1, Powershell 4.0, CurrentCulture cs-CZ, CurrentUICulture en-GB, ANSICodePage 1250, OEMCodePage 852, का अनुवाद 'řž'उपर्युक्त कोड पृष्ठों में विभिन्न कोडों के साथ स्ट्रिंग का उपयोग करके किया गया )।
जोसेफज

यह भी ध्यान दें कि Out-Fileकुछ स्थितियों में लंबी लाइनों के साथ समस्याएं हैं। उदाहरण के लिए $x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt:।
बेकन बिट्स

17

Out-Fileजब तक -NoClobberऔर / या -Appendध्वज सेट नहीं होता है तब तक आउटपुट पथ को ओवरराइट करने का व्यवहार होता है। Add-Contentयदि सामग्री पथ पहले से ही डिफ़ॉल्ट रूप से मौजूद है (यदि यह हो सकता है) तो सामग्री को जोड़ देगा। यदि कोई पहले से मौजूद नहीं है, तो दोनों फ़ाइल बनाएंगे।

एक और दिलचस्प अंतर यह है कि Add-Contentडिफ़ॉल्ट रूप से एक एएससीआईआई एन्कोडेड फ़ाइल Out-Fileबनाई जाएगी और डिफ़ॉल्ट रूप से एक छोटे एंडियन यूनिकोड एनकोडेड फ़ाइल का निर्माण करेगी।

>के लिए एक उर्फ वाक्य रचना चीनी है Out-File। यह Out-Fileकुछ पूर्व-परिभाषित पैरामीटर सेटिंग्स के साथ है।


धन्यवाद, एन्कोडिंग अंतर जानना उपयोगी है। आप बिल्कुल सही, नहीं कर रहे हैं यदि आप echo "" > $null | Add-Content abc.txtयह नहीं है फ़ाइल बनाने abc.txt, जबकि बाहर फ़ाइल होगा।
कर्नल पैनिक

@MattHickford यह एक विषम धार का उदाहरण है। इस कोड पाइप $ null को तो Add-Contentकुछ भी प्राप्त नहीं होता है। अगर Add-Contentकुछ प्राप्त नहीं होता है तो उसे फ़ाइल क्यों बनाना चाहिए? दूसरी ओर एक ही सवाल आउट-फाइल से पूछा जा सकता है।
एंडी अरिस्मेंडी

अंतर मेरे लिए gci $folder | Out-File log.txt ; cat log.txtकाम करता है, जबकि gci $folder | Add-Content log.txt ; cat log.txtऊपर चल रहा है
कर्नल पैनिक

@MattHickford मैं शायद यह सुनिश्चित करूँ कि फ़ाइल को संसाधित करने से पहले मौजूद है। शायद सभी भाषाओं के लिए एक अच्छी आदत।
एंडी अरिस्मेंडी

एक और अंतर यह है कि Set-Contentउपयोग किए जाने के दौरान, फ़ाइल अन्य अनुप्रयोगों के लिए अनुपलब्ध है।
कर्नल पैनिक

10

खैर, मैं असहमत होगा ... :)

  1. ऐड-कंटेंट से हटकर आउट-फाइल में -Append (-NoClober है)। लेकिन यह वही जानवर नहीं है।
  2. कमान | Add-Content का उपयोग करेगा। इनपुट पर (.String) विधि। आउट-फ़ाइल डिफ़ॉल्ट स्वरूपण का उपयोग करेगी।

इसलिए:

ls | Add-Content test.txt

तथा

ls | Out-File test.txt

आपको पूरी तरह से अलग परिणाम देगा।

और नहीं, '>' उर्फ ​​नहीं है, यह पुनर्निर्देशन ऑपरेटर (अन्य गोले के समान) है। और बहुत गंभीर सीमा है ... यह लाइनों को उसी तरह काट देगा जैसे वे प्रदर्शित होते हैं। आउट-फ़ाइल में -Width पैरामीटर है जो आपको इससे बचने में मदद करता है। इसके अलावा, पुनर्निर्देशन ऑपरेटरों के साथ आप तय नहीं कर सकते कि किस एन्कोडिंग का उपयोग करना है।

HTH बारटेक


3
यह अर्थ में एक उपनाम है कि >और आउट-फाइल एक ही बात है। वे एक ही कोड कहते हैं। एक्शन के दूसरे संस्करण में ब्रूस पेलेट के पॉवरशेल से (जलाने के स्थान 4646):In fact, myScript > file.txt is just “syntactic sugar” for myScript | out-file -path file.txt In some cases, you’ll want to use Out-File directly because it gives you more control over the way the output is written.
एंडी अरिस्मेंडी

1
डिफ़ॉल्ट स्वरूपण (आउट-फ़ाइल) बनाम ToString (ऐड-कंटेंट) के बारे में अच्छी बात
एंडी अरिस्मेंडी

मेरा कहना था: भले ही दोनों आम तौर पर एक ही करते हैं, उर्फ ​​इसका अर्थ पॉवरशेल में है ... इसलिए मैं इस शब्द का उपयोग उन लोगों के बीच संबंध का वर्णन करने के लिए नहीं करूंगा ..;) अलियास कमांड की जगह लेता है, इस मामले में इसे वाक्यविन्यास करना चाहिए; : ls | > file.txt संभव। जाहिर है, यह काम नहीं करेगा ...
बार्टेक

1
डिफ़ॉल्ट स्वरूपण वह तरीका है जो ऑब्जेक्ट को कंसोल में प्रस्तुत किया जाता है। अधिकांश कोर cmdlets / ऑब्जेक्ट प्रकारों में मेटाडेटा प्रारूपित होता है जो PowerShell को सूचित करता है कि उन्हें उपयोगकर्ता के अनुकूल फैशन में कैसे प्रदर्शित किया जाए। दूसरे शब्दों में: PowerShell द्वारा किए गए स्वरूपण को खोए बिना, आउट-फाइल को कमांड के पाइपिंग परिणाम का उपयोग फाइल में कमांड के आउटपुट को बचाने के लिए किया जा सकता है।
बार्टेक

2
हां, मुझे लगता है कि यह एक महत्वपूर्ण अंतर है जो >इसके लिए सटीक समकक्ष नहीं है out-file। यदि आप सेट करते हैं $PSDefaultParameterValues["Out-File:Encoding"] = "UTF8", तो इसे अनदेखा कर दिया जाएगा >
वारबैंक

3

Set-Contentसमर्थन करता है -Encoding Byte, जबकि Out-Fileनहीं करता है।

इसलिए जब आप Text.Encoding#GetBytes()किसी फ़ाइल का बाइनरी डेटा या परिणाम लिखना चाहते हैं , तो आपको उपयोग करना चाहिए Set-Content


0

आउट-फाइल-टैपेंड या ">>" वास्तव में एक ही फाइल में दो एनकोडिंग को मिला सकते हैं। यहां तक ​​कि अगर फ़ाइल मूल रूप से एएससीआई या एएनआई है, तो यह नीचे तक डिफ़ॉल्ट रूप से यूनिकोड जोड़ देगा। ऐड-कंटेंट एन्कोडिंग की जाँच करेगा और उसे जोड़ने से पहले मिलान करेगा। Btw, एक्सपोर्ट-सीएसवी एस्की (नो एक्सेंट), और सेट-कंटेंट / ऐड-कंटेंट को एंसी में डिफॉल्ट करता है।


0

एन्कोडिंग पर अंतर के बारे में जोड़ना चाहता था:

PowerShell 5.1 के साथ विंडोज:

  • आउट-फ़ाइल - डिफ़ॉल्ट एन्कोडिंग utf-16le है
  • सेट-सामग्री - डिफ़ॉल्ट एन्कोडिंग हमें-एससीआई है

PowerShell 7.1 के साथ लिनक्स:

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