পাওয়ারশেলের ডিফল্ট আউটপুট এনকোডিংটি ইউটিএফ -8 এ পরিবর্তন করা হচ্ছে


105

ডিফল্টরূপে, আপনি যখন কোনও আদেশের আউটপুট কোনও ফাইলে পুনর্নির্দেশ করেন বা এটিকে পাওয়ারশেলের অন্য কোনও কিছুর মধ্যে পাইপ করেন, তখন এনকোডিংটি ইউটিএফ -16 হয়, যা কার্যকর নয়। আমি এটি ইউটিএফ -8 এ পরিবর্তন করতে চাইছি।

>foo.txtসিনট্যাক্সের পরিবর্তে কেস-কেস-কেস ভিত্তিতে এটি করা যেতে পারে | out-file foo.txt -encoding utf8তবে প্রতিবার পুনরাবৃত্তি করতে হবে এটি বিশ্রী।

পাওয়ারশেলে জিনিস সেট করার অবিচ্ছিন্ন উপায় হ'ল সেগুলি putোকানো \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প্রথম নজরে এটি প্রাসঙ্গিক হওয়া উচিত বলে মনে হচ্ছে, তবে এটি আউটপুট এনকোড হওয়ার বিষয়ে কথা বলে এএসসিআইআই-তে, যা আসলে ঘটছে তা নয়।

আপনি কীভাবে ইউটিএফ -8 ব্যবহারের জন্য পাওয়ারশেল সেট করবেন?

উত্তর:


162

দ্রষ্টব্য: নিম্নলিখিতগুলি উইন্ডোজ পাওয়ারশেলের ক্ষেত্রে প্রযোজ্য । ক্রস-প্ল্যাটফর্ম পাওয়ারশেল কোর (v6 +) সংস্করণের জন্য পরবর্তী বিভাগটি
দেখুন ।

  • উপর PSv5.1 বা উচ্চতর , যেখানে >এবং >>কার্যকরভাবে এর alias লেখা হয় 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 , সেমিডলেটগুলিতে রাখেন এবং যেমনOut-FileSet-Content ইউটিএফ -8 এনকোডিংটি ডিফল্টরূপে ব্যবহার করেন তবে মনে রাখবেন যে এটি একটি সেশন-গ্লোবাল সেটিংস তৈরি করে যা এমন সমস্ত কমান্ড / স্ক্রিপ্টগুলিকে প্রভাবিত করবে যা কোনও এনকোডিং স্পষ্টভাবে উল্লেখ করে না।

একইভাবে, আপনার স্ক্রিপ্ট বা মডিউলগুলিতে আপনি একইভাবে আচরণ করতে চান এমন কমান্ডগুলি অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন , যাতে অন্য ব্যবহারকারী বা অন্য কোনও মেশিন দ্বারা চালিত হয়েও তারা প্রকৃতপক্ষে একই আচরণ করে।

ক্যাভেট : ** পাওয়ারশেল, v5.1 হিসাবে অবিচ্ছিন্নভাবে ইউটিএফ -8 ফাইল তৈরি করে _ একটি (সিউডো) বিওএম _ ** দিয়ে , যা কেবল উইন্ডোজ বিশ্বে প্রচলিত - ইউনিক্স ভিত্তিক ইউটিলিটিগুলি এই বিওএমটিকে স্বীকৃতি দেয় না (নীচে দেখুন); বিওএম-কম ইউটিএফ -8 ফাইল তৈরি করা এমন কাজের জন্য এই পোস্টটি দেখুন ।

একটি জন্য উইন্ডোজ PowerShell মান cmdlets অনেক জুড়ে দুর্দান্তভাবে অসঙ্গত ডিফল্ট ক্যারেক্টার এনকোডিং আচরণের সারসংক্ষেপ , নীচে অধ্যায় দেখুন।


স্বয়ংক্রিয় $OutputEncodingচলকটি সম্পর্কিত নয় , এবং কেবল পাওয়ারশেল বাহ্যিক প্রোগ্রামগুলির সাথে কীভাবে যোগাযোগ করে ( প্রযোজ্য পাওয়ারশেল তাদের কাছে স্ট্রিং প্রেরণ করার সময় কী কী ব্যবহার করে) এটি প্রয়োগ করে - ফাইলগুলিতে সংরক্ষণের জন্য আউটপুট পুনর্নির্দেশ অপারেটর এবং পাওয়ারশেল সেমিডলেটগুলি ব্যবহার করে এমন এনকোডিংয়ের সাথে এর কোনও সম্পর্ক নেই।


Readingচ্ছিক পঠন: ক্রস প্ল্যাটফর্মের দৃষ্টিভঙ্গি: পাওয়ারশেল কোর :

পাওয়ারশেল এখন তার পাওয়ারশেল কোর সংস্করণের মাধ্যমে ক্রস প্ল্যাটফর্ম , যার এনকোডিং - সংবেদনশীলভাবে - ইউনিক্সের মতো প্ল্যাটফর্মগুলির সাথে সামঞ্জস্য রেখে বিওএম-কম ইউটিএফ -8 এর ডিফল্ট

  • এর অর্থ হ'ল একটি বিওএমবিহীন উত্স-কোড ফাইলগুলি ইউটিএফ -8 হিসাবে ধরে নেওয়া হয় এবং বিওএম-কম ইউটিএফ -8 এ >/ Out-File/ Set-Contentডিফল্ট ব্যবহার করা হয় ; এর স্পষ্ট ব্যবহার যুক্তি খুব সৃষ্টি BOM-কম হল UTF-8, কিন্তু আপনি ফাইল তৈরি করতে নির্বাচন করতে পারেন সঙ্গে সঙ্গে সিউডো-BOM মান।utf8 -Encodingutf8bom

  • আপনি যদি একটি ইউনিক্স-সদৃশ প্ল্যাটফর্ম এবং আজকাল এমনকি উপর একটি সম্পাদক PowerShell স্ক্রিপ্ট তৈরি করেন উইন্ডোজ যেমন ভিসুয়াল স্টুডিও কোড এবং সর্বোচ্চ পাঠ্য হিসাবে ক্রস-প্ল্যাটফর্ম সম্পাদকদের সাথে, ফলে *.ps1ফাইল সাধারণত হবে না একটি হল UTF-8 সিউডো-BOM আছে:

    • পাওয়ারশেল কোরে এটি কাজ করে ।
    • এটি উইন্ডোজ পাওয়ারশেলের উপর ভেঙে যেতে পারে , যদি ফাইলটিতে অ-এএসসিআইআই অক্ষর থাকে; আপনার স্ক্রিপ্টগুলিতে আপনার যদি নন-এএসসিআইআই অক্ষর ব্যবহার করার প্রয়োজন হয়, তবে তাদের বিওএম সহ ইউটিএফ -8 হিসাবে সংরক্ষণ করুন ।
      বিওএম ব্যতীত উইন্ডোজ পাওয়ারশেল (মিস) আপনার স্ক্রিপ্টটিকে লিগ্যাসিতে "এএনএসআই" কোডপেজ (প্রাক-ইউনিকোড অ্যাপ্লিকেশনগুলির জন্য সিস্টেম লোকাল দ্বারা নির্ধারিত; যেমন, ইউএস-ইংলিশ সিস্টেমে উইন্ডোজ -১২২২) হিসাবে এনকোডড হিসাবে ব্যাখ্যা করেছে।
  • বিপরীতভাবে, যে ফাইল কি হল UTF-8 সিউডো-BOM উপর সমস্যা হতে পারে আছে ইউনিক্সের মত প্ল্যাটফর্মের, তারা যেমন ইউনিক্স ইউটিলিটি কারণ cat, sedএবং awk- এবং যেমন এমন কিছু সম্পাদকদের gedit- এতে মাধ্যমে সিউডো-BOM পাস , অর্থাত্, এটি ডেটা হিসাবে বিবেচনা ।

    • এটি সর্বদা সমস্যা নাও হতে পারে তবে অবশ্যই এটি হতে পারে যেমন আপনি যখন কোনও ফাইলকে স্ট্রিংয়ের bashসাথে স্ট্রিনে পড়ার , বলুন text=$(cat file)বা বলার চেষ্টা করেন text=$(<file)- ফলস্বর ভেরিয়েবলটিতে প্রথম 3 বাইট হিসাবে সিউডো-বিওএম থাকবে।

উইন্ডোজ পাওয়ারশেলে অসামঞ্জস্যপূর্ণ ডিফল্ট এনকোডিং আচরণ :

আফসোস, উইন্ডোজ পাওয়ারশেলে ব্যবহৃত ডিফল্ট চরিত্রের এনকোডিংটি অত্যন্ত বেমানান; পূর্ববর্তী বিভাগে আলোচিত ক্রস-প্ল্যাটফর্ম পাওয়ারশেল কোর সংস্করণ প্রশংসনীয়ভাবে এটিকে দিয়েছিল এবং শেষ করেছে।

বিঃদ্রঃ:

  • নিম্নলিখিতটি সমস্ত স্ট্যান্ডার্ড সেমিলেটলেটগুলি কভার করার আকাঙ্ক্ষা করে না ।

  • গুগলিংয়ের সেমিডলেট নামগুলি তাদের সহায়তার বিষয়গুলি সন্ধানের জন্য এখন আপনাকে ডিফল্টরূপে বিষয়গুলির পাওয়ারশেল কোর সংস্করণ দেখায় ; উইন্ডোজ পাওয়ারশেল সংস্করণে স্যুইচ করতে বামদিকে বিষয়গুলির তালিকার উপরে সংস্করণ ড্রপ-ডাউন তালিকাটি ব্যবহার করুন ।

  • এই লেখাটি হিসাবে, ডকুমেন্টেশনগুলি প্রায়শই ভুলভাবে দাবি করে যে উইন্ডোজ পাওয়ারশেলের মধ্যে ASCII হ'ল ডিফল্ট এনকোডিং - এই গিটহাব ডকস ইস্যুটি দেখুন


Cmdlet যে লিখেছে :

Out-Fileএবং >/ >>"ইউনিকোড" তৈরি করুন - ইউটিএফ-16 এলই - ফাইলগুলি ডিফল্টরূপে - যেখানে প্রতিটি এএসসিআইআই-রেঞ্জের অক্ষর (খুব) 2 বাইট দ্বারা উপস্থাপিত হয় - যা উল্লেখযোগ্যভাবে Set-Content/ Add-Content(পরবর্তী পয়েন্ট দেখুন) থেকে পৃথক ; New-ModuleManifestএবং Export-CliXmlUTF-16LE ফাইল তৈরি করুন।

Set-Content(এবং Add-Contentযদি ফাইলটি এখনও বিদ্যমান না / খালি থাকে) এএনএসআই এনকোডিং ব্যবহার করে (সক্রিয় সিস্টেম লোকেলের এএনএসআই লেগ্যাসি কোড পৃষ্ঠা, যা পাওয়ারশেল কল করে সুনির্দিষ্ট এনকোডিং) ব্যবহার করে Default

Export-Csvপ্রকৃতপক্ষে ডকুমেন্ট হিসাবে ASCII ফাইল তৈরি করে তবে -Appendনীচের নোটগুলি আবার দেখুন।

Export-PSSession ডিফল্টরূপে বিওএম-এর সাথে ইউটিএফ -8 ফাইল তৈরি করে।

New-Item -Type File -Value বর্তমানে বিওএম-কম (!) ইউটিএফ -8 তৈরি করে।

Send-MailMessageসাহায্যের প্রসঙ্গটি দাবী করেন যে হওয়া ASCII এনকোডিং ডিফল্ট - আমি ব্যক্তিগতভাবে যে দাবি যাচাই করেন নি।

Start-Transcript অবিচ্ছিন্নভাবে বিওএম দিয়ে ইউটিএফ -8 ফাইল তৈরি করে তবে -Appendনীচের নোটগুলি আবার দেখুন।

বিদ্যমান ফাইলগুলিতে সংযোজনকারী আদেশগুলি পুনরায় :

>>/ Out-File -Appendকরা কোন একটি ফাইল এর এনকোডিং মেলে প্রয়াস বিদ্যমান সামগ্রী । এটি হ'ল তারা অন্ধভাবে তাদের ডিফল্ট এনকোডিংটি প্রয়োগ করে, যদি না অন্যভাবে নির্দেশিত হয় তবে -Encodingযা >>(PSV5.1 + এ অপ্রত্যক্ষভাবে বাদে $PSDefaultParameterValuesউপরের মতো প্রদর্শিত হবে) এর বিকল্প নয়। সংক্ষেপে: আপনাকে অবশ্যই বিদ্যমান ফাইলের সামগ্রীর এনকোডিংটি জানতে হবে এবং সেই একই এনকোডিংটি ব্যবহার করে সংযোজন করতে হবে।

Add-Contentপ্রশংসনীয় ব্যতিক্রম: সুস্পষ্ট -Encodingযুক্তির অভাবে , এটি বিদ্যমান এনকোডিং সনাক্ত করে এবং স্বয়ংক্রিয়ভাবে এটিকে নতুন সামগ্রীতে প্রয়োগ করে। ধন্যবাদ, js2010 । নোট করুন যে উইন্ডোজ পাওয়ারশেলের মধ্যে এর অর্থ এটি বিদ্যমান একটি সামগ্রীর মধ্যে বিওএম না থাকলে এটিএনএসআই এনকোডিং হয়, তবে পাওয়ারশেল কোরে এটি ইউটিএফ -8 রয়েছে।

Out-File -Append/ >>এবং এর মধ্যে এই অসঙ্গতি Add-Content, যা পাওয়ারশেল কোরকেও প্রভাবিত করে , এই গিটহাব ইস্যুতে আলোচনা করা হয়েছে ।

Export-Csv -Append আংশিকভাবে বিদ্যমান এনকোডিং মেলে: এটি অন্ধভাবে appends হল 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
এএনএসআই হ'ল পাওয়ারশেল ইঞ্জিন যখন ডিফল্ট হয় তখন ফাইল থেকে উত্স কোডটি পড়ে ।

বিপরীতে Import-Csv, Import-CliXmlএবং Select-Stringহল UTF-8 একটি BOM অনুপস্থিতিতে অনুমান।


আপনি ব্যাখ্যা করতে পারেন কিভাবে >/ >>জন্য কার্যকর alias লেখা হয়ে ওঠে Out-File5.1 মধ্যে?
ম্যাক্সিমিলিয়ান বার্সলে

@ দ্য আইসিএনরসিবিএল 1: এটি পেটসারলই হতে পারে যিনি এটি আমাকে দেখিয়েছিলেন তবে কোথায় এবং কীভাবে আমার মনে নেই। উইন্ডোজ পাওয়ারশেলটি ক্লোজড সোর্স, তবে যেহেতু একই কোয়াস-উরফের সম্পর্ক পাওয়ারশেল কোরকেও প্রযোজ্য তাই আপনার এটি পরবর্তী উত্সের কোডটিতে সন্ধান করতে সক্ষম হওয়া উচিত।
mklement0

4
আমি ইলিয়াওয়েস দ্বিমত পোষণ করি না, তবে এটি উইন্ডোজ পাওয়ারশেলটি বিশেষভাবে, এবং তারা শেষ পর্যন্ত পাওয়ারশেল কোর-এ পেয়েছে ।
mklement0

4
@ মার্ক: ভিএস কোড এবং অন্যান্য আধুনিক ক্রস-প্ল্যাটফর্ম সম্পাদকরা প্রশংসনীয়ভাবে ইউটিএফ -8 এ ডিফল্ট হয়েছেন, তবে এর অর্থ তারা এএনএসআই-এনকোডযুক্ত ফাইলগুলির ভুল ব্যাখ্যা করবেন'll এনকোডিং অনুমান করতে নোটপ্যাড হিউরিস্টিক্স ব্যবহার করে । মুল বক্তব্যটি এটি কেবল অনুমান , কারণ যে কোনও ইউটিএফ-8-এনকোডযুক্ত ফাইলটি প্রযুক্তিগতভাবে বৈধ এএনএসআই-এনকোডযুক্ত ফাইল (তবে বিপরীত নয়)। এটি দুর্দান্ত হবে যদি ইউনিক্সের মতো প্ল্যাটফর্মগুলি কোনও বিওএমের অনুপস্থিতিতে উইন্ডোজের সমস্ত কিছু ইউটিএফ -8 এ খেলাপি হয়ে যায়, তবে এটি এমনটি নয়, বিশেষত উইন্ডোজ পাওয়ারশেলের ক্ষেত্রে নয়, যদিও ভাগ্যক্রমে এটি এখন পাওয়ারশেলের ক্ষেত্রে ঘটেছে।
mklement0

4
আপনার বর্তমান মানটি যদি কিছু দেখতে হয় তবে কেবল টাইপ করুন$PSDefaultParameterValues
স্যান্ডবার্গ

3

সংক্ষিপ্ত হতে, ব্যবহার করুন:

write-output "your text" | out-file -append -encoding utf8 "filename"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.