नोट: निम्न 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
-Encoding
utf8bom
यदि आप एक यूनिक्स की तरह मंच और आजकल पर भी पर एक संपादक के साथ 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-CliXml
UTF-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-String
UTF-8 एक बीओएम के अभाव में मान।
>
/ 5.1 में>>
प्रभावी उपनाम बनेOut-File
?