पॉवरशेल के डिफ़ॉल्ट आउटपुट एन्कोडिंग को UTF-8 में बदलना


105

डिफ़ॉल्ट रूप से, जब आप किसी फ़ाइल के कमांड के आउटपुट को रीडायरेक्ट करते हैं और इसे PowerShell में किसी अन्य चीज़ में पाइप करते हैं, तो एन्कोडिंग UTF-16 है, जो उपयोगी नहीं है। मैं इसे यूटीएफ -8 में बदल रहा हूं।

इसे >foo.txtसिंटेक्स की जगह केस-बाय-केस आधार पर किया जा सकता है, | out-file foo.txt -encoding utf8लेकिन हर बार दोहराना अजीब है।

पॉवरशेल में चीजों को सेट करने का लगातार तरीका उन्हें अंदर रखना है \Users\me\Documents\WindowsPowerShell\profile.ps1; मैंने सत्यापित किया है कि यह फ़ाइल वास्तव में स्टार्टअप पर निष्पादित की गई है।

यह कहा गया है कि आउटपुट एन्कोडिंग के साथ सेट किया जा सकता है, $PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}लेकिन मैंने यह कोशिश की है और इसका कोई प्रभाव नहीं पड़ा।

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/ जो $OutputEncodingपहली नज़र में लग रहा है के बारे में बात करता है जैसे कि यह प्रासंगिक होना चाहिए, लेकिन फिर यह आउटपुट एनकोडेड होने की बात करता है। ASCII में, जो वास्तव में नहीं हो रहा है।

आप UTF-8 का उपयोग करने के लिए PowerShell कैसे सेट करते हैं?

जवाबों:


162

नोट: निम्न Windows PowerShell पर लागू होता है । क्रॉस-प्लेटफ़ॉर्म PowerShell Core (v6 +) संस्करण के लिए अगला अनुभाग
देखें ।

  • पर PSv5.1 या उच्चतर है, जहां >और >>प्रभावी ढंग से की उपनाम हैं Out-File, तो आप कर सकते हैं डिफ़ॉल्ट एन्कोडिंग सेट के लिए >/ >>/ Out-Fileके माध्यम से $PSDefaultParameterValuesवरीयता चर :

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • पर PSv5.0 या नीचे , आप नहीं कर सकते का कूटबन्धन बदलने >/>> है, लेकिन, पर PSv3 या उच्चतर , ऊपर तकनीक करता है करने के लिए स्पष्ट कॉल के लिए कामOut-File
    ( $PSDefaultParameterValuesवरीयता चर PSv3.0 में पेश किया गया था)।

  • पर PSv3.0 या उच्चतर , आप चाहते हैं, तो डिफ़ॉल्ट के लिए एन्कोडिंग सेट सभी cmdlets का समर्थन करने वाले
    एक -Encodingपैरामीटर
    (PSv5.1 + में शामिल है, जो >और >>), उपयोग करें:

    • $PSDefaultParameterValues['*:Encoding'] = 'utf8'

यदि आप इस कमांड को अपने$PROFILE cmdlets में रखते हैं , जैसे कि Out-FileऔरSet-Content डिफ़ॉल्ट रूप से UTF-8 एन्कोडिंग का उपयोग करेंगे, लेकिन ध्यान दें कि यह एक सत्र-वैश्विक सेटिंग बनाता है जो सभी आदेशों / लिपियों को प्रभावित करेगा जो स्पष्ट रूप से एन्कोडिंग निर्दिष्ट नहीं करते हैं।

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

Caveat : ** PowerShell, v5.1 के रूप में, हमेशा UTF-8 फ़ाइलों को बनाता है _with (छद्म) BOM _ ** के साथ , जो केवल विंडोज दुनिया में प्रथागत है - यूनिक्स- आधारित उपयोगिताओं इस BOM को नहीं पहचानती हैं (नीचे देखें); इस पोस्ट को उन वर्कअराउंड के लिए देखें जो BOM- कम UTF-8 फ़ाइलें बनाते हैं।

एक के लिए विंडोज PowerShell cmdlets का मानक किए जाने वाले अनेक बेतहाशा असंगत डिफ़ॉल्ट वर्ण एन्कोडिंग व्यवहार का सारांश , नीचे खंड देखें।


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


वैकल्पिक पढ़ना: क्रॉस-प्लेटफ़ॉर्म परिप्रेक्ष्य: पावरशेल कोर :

PowerShell अब अपने PowerShell Core संस्करण के माध्यम से क्रॉस-प्लेटफ़ॉर्म है , जिसका एन्कोडिंग - समझदारी से - बेम-कम UTF-8 के लिए डिफ़ॉल्ट , यूनिक्स-जैसे प्लेटफार्मों के अनुरूप है।

  • इसका मतलब यह है कि बिना बीओएम के स्रोत-कोड फ़ाइलों को यूटीएफ -8 माना जाता है, और बीओएम-कम यूटीएफ -8 के लिए >/ Out-File/ Set-Contentचूक का उपयोग करना ; का स्पष्ट उपयोग तर्क भी बनाता है बीओएम-कम UTF-8, लेकिन आप फ़ाइलें बनाने के लिए विकल्प चुन सकते हैं साथ साथ छद्म बीओएम मूल्य।utf8 -Encodingutf8bom

  • यदि आप एक यूनिक्स की तरह मंच और आजकल पर भी पर एक संपादक के साथ PowerShell स्क्रिप्ट बनाते हैं विंडोज ऐसे दृश्य स्टूडियो संहिता और उदात्त पाठ के रूप में पार मंच संपादकों के साथ, जिसके परिणामस्वरूप *.ps1फ़ाइल आम तौर पर होगा नहीं एक UTF-8 छद्म बीओएम है:

    • यह PowerShell Core पर ठीक काम करता है ।
    • यह Windows PowerShell पर टूट सकता है , यदि फ़ाइल में गैर-ASCII वर्ण हैं; यदि आपको अपनी स्क्रिप्ट में गैर-एएससीआईआई पात्रों का उपयोग करने की आवश्यकता है, तो उन्हें बीओएम के साथ यूटीएफ -8 के रूप में सहेजें ।
      BOM के बिना, Windows PowerShell (mis) आपकी स्क्रिप्ट को विरासत में "ANSI" कोडपेज (पूर्व-यूनिकोड अनुप्रयोगों के लिए सिस्टम लोकेल द्वारा निर्धारित; उदाहरणार्थ, US-English सिस्टम पर Windows-1252) में एन्कोडेड होने के रूप में व्याख्या करता है।
  • इसके विपरीत, फ़ाइलों को करना UTF-8 छद्म बीओएम पर समस्याग्रस्त हो सकता है यूनिक्स की तरह प्लेटफार्मों, के रूप में वे इस तरह के रूप यूनिक्स उपयोगिताओं कारण cat, sedऔर awk- और जैसे भी कुछ संपादकों gedit- करने के लिए के माध्यम से छद्म बीओएम पारित , यानी, इसे डेटा के रूप में मानने के लिए

    • यह हमेशा एक समस्या नहीं हो सकती है, लेकिन निश्चित रूप से हो सकती है, जैसे कि जब आप किसी फ़ाइल को स्ट्रिंग में एक bashसाथ पढ़ने की कोशिश करते हैं , कहते हैं, text=$(cat file)या text=$(<file)- परिणामी चर में पहले 3 बाइट्स के रूप में छद्म-बीओएम शामिल होगा।

Windows PowerShell में असंगत डिफ़ॉल्ट एन्कोडिंग व्यवहार :

अफसोस, विंडोज पावरस्ले में इस्तेमाल किया गया डिफ़ॉल्ट चरित्र एन्कोडिंग बेतहाशा असंगत है; क्रॉस-प्लेटफ़ॉर्म PowerShell कोर संस्करण, जैसा कि पिछले अनुभाग में चर्चा की गई है, ने सराहनीय रूप से इसे रखा और समाप्त किया है।

ध्यान दें:

  • निम्नलिखित सभी मानक cmdlets को कवर करने की आकांक्षा नहीं करता है ।

  • अब उनके मदद विषय खोजने के लिए cmdlet के नामों का पता लगाना, आपको डिफ़ॉल्ट रूप से विषयों के PowerShell कोर संस्करण को दिखाता है ; Windows PowerShell संस्करण पर स्विच करने के लिए बाईं ओर विषयों की सूची के ऊपर संस्करण ड्रॉप-डाउन सूची का उपयोग करें ।

  • इस लेखन के रूप में, प्रलेखन अक्सर गलत तरीके से दावा करता है कि ASCII विंडोज पॉवरशेल में डिफ़ॉल्ट एन्कोडिंग है - इस GitHub डॉक्स समस्या को देखें


Cmdlets जो लिखते हैं :

Out-Fileऔर >/ >>"यूनिकोड" बनाएं - UTF-16LE - डिफ़ॉल्ट रूप से फाइलें - जिसमें प्रत्येक ASCII- श्रेणी के चरित्र (भी) को 2 बाइट्स द्वारा दर्शाया जाता है - जो विशेष रूप से Set-Content/ से अलग होता है Add-Content(अगला बिंदु देखें); New-ModuleManifestऔर Export-CliXmlUTF-16LE फ़ाइलें भी बनाएं।

Set-Content(और Add-Contentयदि फ़ाइल अभी तक मौजूद नहीं है / खाली है) ANSI एन्कोडिंग का उपयोग करता है (सक्रिय सिस्टम लोकेल के ANSI विरासत कोड पृष्ठ द्वारा निर्दिष्ट एन्कोडिंग, जिसे PowerShell कॉल करता है Default)।

Export-Csvवास्तव में दस्तावेज के रूप में ASCII फाइलें बनाता है, लेकिन -Appendनीचे दिए गए नोट्स देखें।

Export-PSSession डिफ़ॉल्ट रूप से BOM के साथ UTF-8 फाइलें बनाता है।

New-Item -Type File -Value वर्तमान में BOM- कम (!) UTF-8 बनाता है।

Send-MailMessageमदद विषय भी दावा है कि ASCII एन्कोडिंग डिफ़ॉल्ट है - मैं व्यक्तिगत रूप से उस दावे को सत्यापित नहीं किया है।

Start-Transcript हमेशा BOM के साथ UTF-8 फाइलें बनाता है , लेकिन -Appendनीचे दिए गए नोट्स देखें।

पुन आदेशों संलग्न किसी मौजूदा फ़ाइल के लिए:

>>/ Out-File -Appendबनाने के लिए कोई एक फ़ाइल की एन्कोडिंग मैच के लिए प्रयास मौजूदा सामग्री । यही है, वे नेत्रहीन अपने डिफ़ॉल्ट एन्कोडिंग को लागू करते हैं, जब तक कि अन्यथा के साथ निर्देश नहीं दिया जाता है -Encoding, जो कि >>(पीएसवी 5.1 + में अप्रत्यक्ष रूप से छोड़कर $PSDefaultParameterValues, जैसा कि ऊपर दिखाया गया है) के साथ कोई विकल्प नहीं है । संक्षेप में: आपको किसी मौजूदा फ़ाइल की सामग्री की एन्कोडिंग पता होनी चाहिए और उसी एन्कोडिंग का उपयोग करके जोड़ना चाहिए।

Add-Contentप्रशंसनीय अपवाद है: एक स्पष्ट -Encodingतर्क के अभाव में , यह मौजूदा एन्कोडिंग का पता लगाता है और स्वचालित रूप से नई सामग्री पर लागू होता है। धन्यवाद, js2010 । ध्यान दें कि Windows PowerShell में इसका मतलब है कि यह ANSI एन्कोडिंग है जो कि लागू किया जाता है यदि मौजूदा सामग्री में कोई BOM नहीं है, जबकि यह PowerShell Core में UTF-8 है।

के बीच इस असंगति Out-File -Append/ >>और Add-Content, जो भी PowerShell को प्रभावित करता है कोर , में चर्चा की है इस GitHub मुद्दे

Export-Csv -Append आंशिक रूप से मौजूदा एन्कोडिंग से मेल खाता है: यह आँख बंद करके UTF-8 को जोड़ देता है यदि मौजूदा फ़ाइल की एन्कोडिंग ASCII / UTF-8 / ANSI में से कोई है, लेकिन सही ढंग से UTF-16LE और UTF-16BE से मेल खाती है।
इसे अलग तरीके से रखने के लिए: बीओएम की अनुपस्थिति में, Export-Csv -Appendयूटीएफ -8 मान लेता है, जबकि Add-Contentएएनएसआई मानता है।

Start-Transcript -Append आंशिक रूप से मौजूदा एन्कोडिंग से मेल खाता है: यह सही ढंग से बीओएम के साथ एनकोडिंग से मेल खाता है , लेकिन एक के अभाव में संभावित रूप से हानिपूर्ण एएससीआईआई एन्कोडिंग के लिए चूक।


Cmdlets जो पढ़ते हैं (वह है, BOM की अनुपस्थिति में उपयोग की जाने वाली एन्कोडिंग ):

Get-Contentऔर Import-PowerShellDataFileएएनएसआई के लिए डिफ़ॉल्ट ( Default), जो संगत है Set-Content
ANSI यह भी है कि जब PowerShell इंजन खुद को डिफॉल्ट करता है, जब वह फाइलों से सोर्स कोड पढ़ता है ।

इसके विपरीत, Import-Csv, Import-CliXmlऔर Select-StringUTF-8 एक बीओएम के अभाव में मान।


क्या आप समझा सकते हैं कि कैसे >/ 5.1 में >>प्रभावी उपनाम बने Out-File?
मैक्सिमिलियन बर्स्ज़ले

@ TheInrigrigible1: यह पेट्सरेल हो सकता है जिसने इसे मेरी ओर इशारा किया, लेकिन मुझे याद नहीं है कि मैं कहाँ और कैसे। Windows PowerShell बंद-स्रोत है, लेकिन चूंकि वही अर्ध-उपनाम संबंध PowerShell Core पर भी लागू होता है, इसलिए आपको इसे बाद के स्रोत कोड में खोजने में सक्षम होना चाहिए।
mklement0

2
मैं असहमत नहीं हूं, @EliaWeiss, लेकिन यह विशेष रूप से विंडोज पॉवरशेल है, और उन्होंने अंततः पॉवरशेल कोर में इसे ठीक से प्राप्त किया ।
mklement0

2
@ एमआरसी: वीएस कोड और अन्य आधुनिक क्रॉस-प्लेटफॉर्म संपादक यूटीएफ -8 के लिए सराहनीय रूप से डिफ़ॉल्ट हैं, हालांकि, इसका मतलब है कि वे एएनएसआई-एन्कोडेड फ़ाइलों की गलत व्याख्या करेंगे। नोटपैड एन्कोडिंग का अनुमान लगाने के लिए heuristics का उपयोग करता है । मुद्दा यह है कि यह केवल एक अनुमान है , क्योंकि कोई भी UTF-8-एन्कोडेड फ़ाइल तकनीकी रूप से मान्य ANSI-एन्कोडेड फ़ाइल (लेकिन इसके विपरीत नहीं) है। यह बहुत अच्छा होगा यदि विंडोज पर सबकुछ यूएमएफ -8 में डिफ़ॉल्ट रूप से एक यूओएम-जैसे प्लेटफार्मों के अभाव में होता है, लेकिन ऐसा नहीं है, विशेष रूप से विंडोज पावरशेल में नहीं, हालांकि सौभाग्य से यह अब पावरहेल कोर में मामला है।
mklement0

2
अपने वर्तमान मूल्य को देखने के लिए यदि कुछ, बस टाइप करें$PSDefaultParameterValues
सैंडबर्ग

3

संक्षिप्त होने के लिए, उपयोग करें:

write-output "your text" | out-file -append -encoding utf8 "filename"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.