বিওএম ছাড়াই ইউটিএফ -8 এ একটি ফাইল লিখতে পাওয়ারশেল ব্যবহার করে


246

Out-File ইউটিএফ -8 ব্যবহার করার সময় বিওএমকে জোর করে বলে মনে হচ্ছে:

$MyFile = Get-Content $MyPath
$MyFile | Out-File -Encoding "UTF8" $MyPath

আমি কীভাবে ইউটিএফ -8 এ বিদ্যুৎ ব্যবহার না করে কোনও বিওএম ব্যবহার করব?


23
বিওএম = বাইট-অর্ডার চিহ্ন। "Ï» ¿"এর মতো দেখতে ফাইলের (0xEF, 0xBB, 0xBF) এর শুরুতে তিনটি অক্ষর রাখা হয়েছে
সিগন্যাল 15

40
এটি অবিশ্বাস্যরকম হতাশাব্যঞ্জক। এমনকি তৃতীয় পক্ষের মডিউলগুলিও দূষিত হয়ে যায়, যেমন এসএসএইচ দিয়ে কোনও ফাইল আপলোড করার চেষ্টা করে? BOM! "হ্যাঁ, আসুন প্রতিটি ফাইলকে দূষিত করি; এটি একটি ভাল ধারণা বলে মনে হচ্ছে" " -Microsoft।
মাইকেলগিজি

3
ডিফল্ট এনকোডিংটি
ইউটিএফ

পিছনে সামঞ্জস্যতা ভাঙার বিষয়ে কথা বলুন ...
ড্রাগস

উত্তর:


220

.NET এর UTF8Encodingক্লাস ব্যবহার $Falseকরা এবং কনস্ট্রাক্টরের কাছে যাওয়ার কাজটি মনে হচ্ছে:

$MyRawString = Get-Content -Raw $MyPath
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllLines($MyPath, $MyRawString, $Utf8NoBomEncoding)

42
উঘ, আমি আশা করি এটি একমাত্র উপায় নয়।
স্কট মিউ

114
এক লাইনই [System.IO.File]::WriteAllLines($MyPath, $MyFile)যথেষ্ট। এইWriteAllLines ওভারলোডটি বিওএম ছাড়াই ইউটিএফ 8 লিখেছে।
রোমান কুজমিন

6
: এখানে একটি দুটিই MSDN বৈশিষ্ট্য অনুরোধ তৈরি connect.microsoft.com/PowerShell/feedbackdetail/view/1137121/...
Groostav

3
নোট যে WriteAllLinesপ্রয়োজন বলে মনে হচ্ছে$MyPath পরম হতে হবে ।
স্কুবার্থ

10
@xdhmoore WriteAllLinesথেকে বর্তমান ডিরেক্টরিটি পেয়েছে [System.Environment]::CurrentDirectory। আপনি যদি পাওয়ারশেলটি ওপেন করেন এবং তারপরে আপনার বর্তমান ডিরেক্টরিটি (ব্যবহার করে cdবা Set-Location) পরিবর্তন করেন তবে পরিবর্তন [System.Environment]::CurrentDirectoryহবে না এবং ফাইলটি ভুল ডিরেক্টরিতে থাকবে। আপনি এটিকে ঘিরে কাজ করতে পারেন [System.Environment]::CurrentDirectory = (Get-Location).Path
শায়ান তোকারাই

79

সঠিক এখন হিসাবে উপায় একটি সমাধান @Roman Kuzmin দ্বারা বাঞ্ছনীয় ব্যবহার করা মন্তব্যে @M করতে। ডডলে উত্তর :

[IO.File]::WriteAllLines($filename, $content)

(আমি অপ্রয়োজনীয় Systemনেমস্পেসের স্পেসিফিকেশন কেটে এটিকে কিছুটা ছোট করে দিয়েছি - এটি ডিফল্টরূপে স্বয়ংক্রিয়ভাবে প্রতিস্থাপন করা হবে))


2
এটি (যে কারণেই হোক না কেন) আমার জন্য বিওএম সরিয়ে দেয়নি, যেখানে গৃহীত উত্তর যেমন করেছে
লিয়াম

@ লিয়াম, সম্ভবত পাওয়ারশেল বা। নেট এর কিছু পুরানো সংস্করণ?
ফোরনেভের

1
আমি বিশ্বাস করি .NET WritAllLines ফাংশনের পুরানো সংস্করণগুলি ডিওএলটি দ্বারা বিওএমটি লিখেছিল। সুতরাং এটি একটি সংস্করণ সমস্যা হতে পারে।
সর্বকালের সর্বশ্রেষ্ঠ

2
পাওয়ারশেল 3 এ বিওএম দিয়ে লেখার সাথে নিশ্চিত হয়েছেন, তবে পাওয়ারশেল ৪-এ বিওএম ছাড়াই আমাকে এম ডুডলির আসল উত্তরটি ব্যবহার করতে হয়েছিল।
chazbot7

2
সুতরাং এটি উইন্ডোজ 10 এ কাজ করে যেখানে এটি ডিফল্টরূপে ইনস্টল করা হয়। :) এছাড়াও, প্রস্তাবিত উন্নতির জন্য:[IO.File]::WriteAllLines(($filename | Resolve-Path), $content)
জনি স্কোভডাল

50

আমি অনুভব করেছি যে এটি ইউটিএফ হবে না, তবে আমি সবেমাত্র একটি খুব সহজ সমাধান পেয়েছি যা কাজ করে বলে মনে হচ্ছে ...

Get-Content path/to/file.ext | out-file -encoding ASCII targetFile.ext

আমার জন্য ফলাফল উত্স বিন্যাস নির্বিশেষে বোম ফাইল ছাড়াই একটি utf-8 এ ফলাফল।


8
আমি -encoding utf8আমার প্রয়োজনের জন্য ব্যতীত এটি আমার পক্ষে কাজ করেছিল ।
চিম চিমজ

1
আপনাকে অনেক ধন্যবাদ. আমি একটি সরঞ্জামের ডাম্প লগগুলি নিয়ে কাজ করছি - যার ভিতরে ট্যাব ছিল। ইউটিএফ -8 কাজ করছে না। এএসসিআইআই সমস্যার সমাধান করেছে। ধন্যবাদ।
ব্যবহারকারী 1529294

44
হ্যাঁ, -Encoding ASCIIবিওএম সমস্যা এড়ায়, তবে আপনি কেবল 7 বিট ASCII অক্ষর পাবেন । প্রদত্ত যে ASCII হল UTF-8 এর একটি উপসেট, ফলস্বরূপ ফাইলটি প্রযুক্তিগতভাবে একটি বৈধ UTF-8 ফাইলও, তবে আপনার ইনপুটটিতে সমস্ত অ-ASCII অক্ষরগুলি আক্ষরিক ?অক্ষরে রূপান্তরিত হবে
mklement0

4
@ চিমচিম্জ আমি ঘটনাক্রমে আপনার মন্তব্যটিকে আপ-ভোট দিয়েছি, তবে -encoding utf8এখনও ইউটিএফ -8 কে একটি বিওএম দিয়ে আউটপুট করি। :(
থুডুড অ্যাবাইডস

33

দ্রষ্টব্য: এই উত্তরটি উইন্ডোজ পাওয়ারশেলের ক্ষেত্রে প্রযোজ্য ; বিপরীতে, ক্রস প্ল্যাটফর্ম পাওয়ারশেল কোর সংস্করণে (v6 +), বিওএম ছাড়াই ইউটিএফ -8 হ'ল সমস্ত সেমিডলেট জুড়েই ডিফল্ট এনকোডিং
অন্য কথায়: আপনি যদি পাওয়ারশেল [কোর] সংস্করণ 6 বা ততোধিক ব্যবহার করে থাকেন তবে আপনি বিওএম-কম ইউটিএফ -8 ফাইল ডিফল্টরূপে পাবেন (যা আপনি স্পষ্টভাবে -Encoding utf8/ / এর সাথে অনুরোধও -Encoding utf8NoBOMকরতে পারেন, যেখানে আপনি -বিওএম এনকোডিং সহ পাবেন )।-utf8BOM


পূরক এম ডুডলির নিজস্ব সহজ এবং বাস্তববাদী উত্তরকে (এবং ফরনিভের এর আরও সংক্ষিপ্ত সংশোধন) ):

সুবিধার জন্য, এখানে উন্নত ফাংশন Out-FileUtf8NoBom, একটি পাইপলাইন-ভিত্তিক বিকল্প যা নকল করেOut-File , যার অর্থ:

  • আপনি এটি Out-Fileপাইপলাইনের মতো ব্যবহার করতে পারেন ।
  • ইনপুট অবজেক্টস যা স্ট্রিং নয় সেগুলি যেমন ফর্ম্যাট করা হয় ঠিক তেমনই আপনি যদি কনসোলে প্রেরণ করেন তবে Out-File

উদাহরণ:

(Get-Content $MyPath) | Out-FileUtf8NoBom $MyPath

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

স্মৃতি ব্যবহারের জন্য একটি নোট :

  • এম ডুডলির নিজস্ব উত্তরের জন্য সম্পূর্ণ ফাইলের সামগ্রীগুলি প্রথমে মেমরিতে তৈরি করা দরকার যা বড় ফাইলগুলি নিয়ে সমস্যা হতে পারে।
  • নীচের ফাংশনটি এটির উপরে সামান্য উন্নতি করে: সমস্ত ইনপুট অবজেক্টগুলি এখনও প্রথমে বাফার হয় তবে তাদের স্ট্রিং উপস্থাপনাগুলি পরে উত্পন্ন হয় এবং একে একে আউটপুট ফাইলে লিখিত হয়।

উত্সের কোডOut-FileUtf8NoBom ( এমআইটি-লাইসেন্সযুক্ত গিস্ট হিসাবেও উপলব্ধ ):

<#
.SYNOPSIS
  Outputs to a UTF-8-encoded file *without a BOM* (byte-order mark).

.DESCRIPTION
  Mimics the most important aspects of Out-File:
  * Input objects are sent to Out-String first.
  * -Append allows you to append to an existing file, -NoClobber prevents
    overwriting of an existing file.
  * -Width allows you to specify the line width for the text representations
     of input objects that aren't strings.
  However, it is not a complete implementation of all Out-String parameters:
  * Only a literal output path is supported, and only as a parameter.
  * -Force is not supported.

  Caveat: *All* pipeline input is buffered before writing output starts,
          but the string representations are generated and written to the target
          file one by one.

.NOTES
  The raison d'être for this advanced function is that, as of PowerShell v5,
  Out-File still lacks the ability to write UTF-8 files without a BOM:
  using -Encoding UTF8 invariably prepends a BOM.

#>
function Out-FileUtf8NoBom {

  [CmdletBinding()]
  param(
    [Parameter(Mandatory, Position=0)] [string] $LiteralPath,
    [switch] $Append,
    [switch] $NoClobber,
    [AllowNull()] [int] $Width,
    [Parameter(ValueFromPipeline)] $InputObject
  )

  #requires -version 3

  # Make sure that the .NET framework sees the same working dir. as PS
  # and resolve the input path to a full path.
  [System.IO.Directory]::SetCurrentDirectory($PWD.ProviderPath) # Caveat: Older .NET Core versions don't support [Environment]::CurrentDirectory
  $LiteralPath = [IO.Path]::GetFullPath($LiteralPath)

  # If -NoClobber was specified, throw an exception if the target file already
  # exists.
  if ($NoClobber -and (Test-Path $LiteralPath)) {
    Throw [IO.IOException] "The file '$LiteralPath' already exists."
  }

  # Create a StreamWriter object.
  # Note that we take advantage of the fact that the StreamWriter class by default:
  # - uses UTF-8 encoding
  # - without a BOM.
  $sw = New-Object IO.StreamWriter $LiteralPath, $Append

  $htOutStringArgs = @{}
  if ($Width) {
    $htOutStringArgs += @{ Width = $Width }
  }

  # Note: By not using begin / process / end blocks, we're effectively running
  #       in the end block, which means that all pipeline input has already
  #       been collected in automatic variable $Input.
  #       We must use this approach, because using | Out-String individually
  #       in each iteration of a process block would format each input object
  #       with an indvidual header.
  try {
    $Input | Out-String -Stream @htOutStringArgs | % { $sw.WriteLine($_) }
  } finally {
    $sw.Dispose()
  }

}

16

সংস্করণ from থেকে শুরু করে পাওয়ারশেল সেট-সামগ্রী এবং আউট-ফাইলUTF8NoBOM উভয়ের জন্য এনকোডিং সমর্থন করে এবং এটি ডিফল্ট এনকোডিং হিসাবে ব্যবহার করে।

সুতরাং উপরের উদাহরণে এটি সহজভাবে এর মতো হওয়া উচিত:

$MyFile | Out-File -Encoding UTF8NoBOM $MyPath

@ রাউলসালিনাস-মন্টেগুডো আপনি কোন সংস্করণে আছেন?
জন বেন্টলে

খুশী হলাম। এফওয়াইআই চেক সংস্করণ সহ$PSVersionTable.PSVersion
কেসিডি

14

Set-Contentপরিবর্তে ব্যবহার করার সময় Out-File, আপনি এনকোডিং নির্দিষ্ট করতে পারেন Byte, যা কোনও ফাইলে বাইট অ্যারে লিখতে ব্যবহার করা যেতে পারে। এটি কাস্টম ইউটিএফ 8 এনকোডিংয়ের সাথে সংমিশ্রণে যা বিওএম নির্গত হয় না তা পছন্দসই ফলাফল দেয়:

# This variable can be reused
$utf8 = New-Object System.Text.UTF8Encoding $false

$MyFile = Get-Content $MyPath -Raw
Set-Content -Value $utf8.GetBytes($MyFile) -Encoding Byte -Path $MyPath

ব্যবহার [IO.File]::WriteAllLines()বা অনুরূপের পার্থক্য হ'ল এটি কেবল প্রকৃত ফাইল পাথই নয়, যে কোনও ধরণের আইটেম এবং পাথের সাথে ভাল কাজ করা উচিত।


5

এই স্ক্রিপ্টটি বিআওএম ছাড়াই ইউটিএফ -8 এ রূপান্তরিত হবে, সমস্ত .txt ফাইলগুলিকে DIRECTORY1 এ রূপান্তর করবে এবং এটিকে DIRECTORY2 এ আউটপুট দেবে

foreach ($i in ls -name DIRECTORY1\*.txt)
{
    $file_content = Get-Content "DIRECTORY1\$i";
    [System.IO.File]::WriteAllLines("DIRECTORY2\$i", $file_content);
}

এটি কোনও সতর্কতা ছাড়াই ব্যর্থ। এটি চালানোর জন্য আমার পাওয়ারশেলের কোন সংস্করণ ব্যবহার করা উচিত?
darksoulsong

3
WritAllLines সমাধান ছোট ফাইলগুলির জন্য দুর্দান্ত কাজ করে। তবে বড় ফাইলগুলির জন্য আমার একটি সমাধান দরকার। যতবারই আমি বড় ফাইলের সাথে এটি ব্যবহার করার চেষ্টা করি আমি একটি আউটআউফ মেমরি ত্রুটি পাচ্ছি।
বারমুডা ল্যাম্ব

2
    [System.IO.FileInfo] $file = Get-Item -Path $FilePath 
    $sequenceBOM = New-Object System.Byte[] 3 
    $reader = $file.OpenRead() 
    $bytesRead = $reader.Read($sequenceBOM, 0, 3) 
    $reader.Dispose() 
    #A UTF-8+BOM string will start with the three following bytes. Hex: 0xEF0xBB0xBF, Decimal: 239 187 191 
    if ($bytesRead -eq 3 -and $sequenceBOM[0] -eq 239 -and $sequenceBOM[1] -eq 187 -and $sequenceBOM[2] -eq 191) 
    { 
        $utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False) 
        [System.IO.File]::WriteAllLines($FilePath, (Get-Content $FilePath), $utf8NoBomEncoding) 
        Write-Host "Remove UTF-8 BOM successfully" 
    } 
    Else 
    { 
        Write-Warning "Not UTF-8 BOM file" 
    }  

উত্স কীভাবে পাওয়ারশেল ব্যবহার করে কোনও ফাইল থেকে ইউটিএফ 8 বাইট অর্ডার মার্ক (বিওএম) সরাবেন


2

আপনি যদি ব্যবহার করতে চান তবে আপনার [System.IO.File]::WriteAllLines()দ্বিতীয় প্যারামিটারটি কাস্ট করা উচিত String[](যদি এর ধরণ থাকে $MyFileতবে Object[]) এবং এর সাথে নিখুঁত পথও নির্দিষ্ট করতে হবে $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($MyPath):

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
Get-ChildItem | ConvertTo-Csv | Set-Variable MyFile
[System.IO.File]::WriteAllLines($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($MyPath), [String[]]$MyFile, $Utf8NoBomEncoding)

আপনি যদি ব্যবহার করতে চান তবে [System.IO.File]::WriteAllText()মাঝে মাঝে | Out-String |প্রতিটি লাইনের শেষে স্পষ্ট করে সিআরএলএফ যুক্ত করতে দ্বিতীয় প্যারামিটারটি পাইপ করা উচিত (বিশেষত যখন আপনি এগুলি ব্যবহার করেন ConvertTo-Csv):

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
Get-ChildItem | ConvertTo-Csv | Out-String | Set-Variable tmp
[System.IO.File]::WriteAllText("/absolute/path/to/foobar.csv", $tmp, $Utf8NoBomEncoding)

অথবা আপনি ব্যবহার করতে পারেন [Text.Encoding]::UTF8.GetBytes()সঙ্গে Set-Content -Encoding Byte:

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
Get-ChildItem | ConvertTo-Csv | Out-String | % { [Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Encoding Byte -Path "/absolute/path/to/foobar.csv"

দেখুন: বিওএম ছাড়াই ইউটিএফ -8-এ কোনও ফাইলে কনভার্টটো-সিএসভির ফলাফল কীভাবে লিখবেন


ভাল পয়েন্টার; পরামর্শ /: এর সহজ বিকল্প $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($MyPath)হ'ল Convert-Path $MyPath; আপনি যদি কোনও পিছনের সিআরএলএফ নিশ্চিত করতে চান তবে কেবল [System.IO.File]::WriteAllLines()একটি একক ইনপুট স্ট্রিং দিয়েও (কোনও প্রয়োজন নেই Out-String) ব্যবহার করুন।
mklement0

0

আমি যে কৌশলটি ব্যবহার করি তা হ'ল আউট-ফাইল সেন্টিমিডলেট ব্যবহার করে কোনও ASCII ফাইলে আউটপুট পুনর্নির্দেশ করা ।

উদাহরণস্বরূপ, আমি প্রায়শই এসকিউএল স্ক্রিপ্টগুলি চালিত করি যা ওরাকলে এক্সিকিউট করতে অন্য এসকিউএল স্ক্রিপ্ট তৈরি করে। সাধারণ পুনঃনির্দেশের (">") সাথে আউটপুটটি ইউটিএফ -16 এ হবে যা এসকিউএলপ্লাস দ্বারা স্বীকৃত নয়। এটি প্রায় কাজ করতে:

sqlplus -s / as sysdba "@create_sql_script.sql" |
Out-File -FilePath new_script.sql -Encoding ASCII -Force

উত্পন্ন স্ক্রিপ্টটি কোনও ইউনিকোড উদ্বেগ ছাড়াই অন্য এসকিউএলপ্লাস সেশনের মাধ্যমে কার্যকর করা যেতে পারে:

sqlplus / as sysdba "@new_script.sql" |
tee new_script.log

4
হ্যাঁ, -Encoding ASCIIবিওএম সমস্যা এড়ায়, তবে আপনি অবশ্যই 7-বিট ASCII অক্ষরের জন্য সমর্থন পাবেন । প্রদত্ত যে ASCII হল UTF-8 এর একটি উপসেট, ফলস্বরূপ ফাইলটি প্রযুক্তিগতভাবে একটি বৈধ UTF-8 ফাইলও, তবে আপনার ইনপুটটিতে সমস্ত অ-ASCII অক্ষরগুলি আক্ষরিক ?অক্ষরে রূপান্তরিত হবে
mklement0

এই উত্তরের আরও ভোট দরকার। বিওএম এর সাথে স্ক্যালপ্লাসের অসঙ্গতি অনেক মাথাব্যথার কারণ ।
অমিত নাইডু

0

বিওএম ছাড়াই ইউটিএফ -8 এ এক্সটেনশান দ্বারা একাধিক ফাইল পরিবর্তন করুন:

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
foreach($i in ls -recurse -filter "*.java") {
    $MyFile = Get-Content $i.fullname 
    [System.IO.File]::WriteAllLines($i.fullname, $MyFile, $Utf8NoBomEncoding)
}

0

যে কারণেই হোক না কেন, WriteAllLinesকলগুলি এখনও বিএমএসবিহীন UTF8Encodingযুক্তি ছাড়াই এবং এটি ছাড়াই আমার জন্য একটি বিএম তৈরি করে। তবে নিম্নলিখিতগুলি আমার পক্ষে কাজ করেছে:

$bytes = gc -Encoding byte BOMthetorpedoes.txt
[IO.File]::WriteAllBytes("$(pwd)\BOMthetorpedoes.txt", $bytes[3..($bytes.length-1)])

এটি কাজ করার জন্য আমাকে ফাইলের পথকে নিখুঁত করতে হয়েছিল। অন্যথায় এটি আমার ডেস্কটপে ফাইলটি লিখেছিল। এছাড়াও, আমি মনে করি এটি কেবল তখনই কাজ করে যদি আপনি জানেন যে আপনার বিওএমটি 3 বাইট। এনকোডিংয়ের উপর ভিত্তি করে প্রদত্ত বিওএম ফর্ম্যাট / দৈর্ঘ্য আশা করা কতটা নির্ভরযোগ্য আমার কোনও ধারণা নেই।

এছাড়াও, লিখিত হিসাবে, এটি সম্ভবত তখনই কাজ করে যদি আপনার ফাইলটি পাওয়ারশেল অ্যারের সাথে ফিট [int32]::MaxValueকরে তবে আমার মেশিনের চেয়ে কিছুটা দৈর্ঘ্যের সীমা কম রয়েছে বলে মনে হয় ।


1
WriteAllLinesছাড়া একটি এনকোডিং যুক্তি কখনো BOM লিখেছেন নিজেই , কিন্তু এটা অনুমেয় যে আপনার স্ট্রিং BOM দিয়ে শুরু ঘটেছে চরিত্র ( U+FEFFউপর কার্যকরভাবে একটি হল UTF-8 BOM নির্মিত লিখিত যা); যেমন: $s = [char] 0xfeff + 'hi'; [io.file]::WriteAllText((Convert-Path t.txt), $s)( কোনও বিওএম লেখা নেই[char] 0xfeff + তা দেখতে বাদ দিন )।
mklement0

1
অপ্রত্যাশিতভাবে অন্য কোনও স্থানে লেখার জন্য: সমস্যাটি হ'ল .NET ফ্রেমওয়ার্কের সাধারণত পাওয়ারশেলের চেয়ে আলাদা আলাদা বর্তমান ডিরেক্টরি থাকে; আপনি তাদের সাথে প্রথমে সিঙ্ক করতে পারেন [Environment]::CurrentDirectory = $PWD.ProviderPath, বা আপনার "$(pwd)\..."পদ্ধতির আরও জেনেরিক বিকল্প হিসাবে (আরও ভাল: "$pwd\..."এমনকি আরও ভাল: "$($pwd.ProviderPath)\..."বা (Join-Path $pwd.ProviderPath ...)), ব্যবহার করুন(Convert-Path BOMthetorpedoes.txt)
mklement0

ধন্যবাদ, আমি বুঝতে পারিনি যে ইউটিএফ -8 বিওএম রূপান্তরটির মতো কোনও বিওএম চরিত্র থাকতে পারে।
xdhmoore

1
সমস্ত বিওএম বাইট সিকোয়েন্স (ইউনিকোড স্বাক্ষর) আসলে বিমূর্ত একক ইউনিকোড চরিত্রেরU+FEFF সম্পর্কিত এনকোডিংয়ের বাইট উপস্থাপনা ।
mklement0

আহ, ঠিক আছে. এটি জিনিস সহজ করে তোলে বলে মনে হচ্ছে না।
xdhmoore

-2

বিওএম ছাড়াই ইউটিএফ 8 পেতে নীচে ব্যবহার করতে পারেন

$MyFile | Out-File -Encoding ASCII

4
না, এটি আউটপুটটিকে বর্তমান এএনএসআই কোডপেজে রূপান্তর করবে (উদাহরণস্বরূপ, সিপি 1251 বা সিপি 1252)। এটি মোটেও ইউটিএফ -8 নয়!
ফরভিনিউর

1
ধন্যবাদ রবিন এটি বিওএম ছাড়াই কোনও ইউটিএফ -8 ফাইল লেখার জন্য কাজ নাও করতে পারে তবে-এনকোডিং এএসসিআইআই বিকল্পটি বিওএমটিকে সরিয়ে দিয়েছে। এইভাবে আমি gvim এর জন্য একটি ব্যাট ফাইল তৈরি করতে পারি। .Bat ফাইলটি বিওএম-এ ছড়িয়ে পড়ছে।
গ্রেগ

3
@ ফরনিভের: আপনি ঠিক বলেছেন যে এনকোডিংটি ASCIIইউটিএফ -8 নয়, তবে এটি বর্তমান এএনএসআই কোডপেজ নয় - আপনি ভাবছেন Default; ASCIIকোডপয়েন্টস> = 128 আক্ষরিক ?দৃষ্টান্তে রূপান্তরিত হয়ে সত্যই 7 বিট ASCII এনকোডিং ।
mklement0

1
@ ফরনিভির: আপনি সম্ভবত "এএনএসআই" বা " বর্ধিত এএসসিআইআই" ভাবছেন । -Encoding ASCIIসত্যই এটি 7-বিট ASCII কেবল তা যাচাই করতে চেষ্টা করুন : 'äb' | out-file ($f = [IO.Path]::GetTempFilename()) -encoding ASCII; '?b' -eq $(Get-Content $f; Remove-Item $f)- এটিকে äএকটিতে প্রতিলিপি করা হয়েছে ?। বিপরীতে, -Encoding Default("এএনএসআই") এটি সঠিকভাবে সংরক্ষণ করবে।
mklement0

3
@rob এটি প্রত্যেকেরই সঠিক উত্তর যাঁকে কেবল utf-8 বা এএসসিআইআই-এর চেয়ে আলাদা যে কোনও কিছুর প্রয়োজন নেই এবং এনকোডিংগুলি এবং ইউনিকোডের উদ্দেশ্য বুঝতে আগ্রহী নয়। আপনি এটি utf-8 হিসাবে ব্যবহার করতে পারেন কারণ সমস্ত ASCII অক্ষরের সমতুল্য utf-8 অক্ষর অভিন্ন (যার অর্থ একটি ASCII- ফাইলকে একটি অভিন্ন ফাইলের একটি utf-8-ফাইলের ফলাফলে রূপান্তর করা (যদি এটি BOM না পায়))। যাদের পাঠ্যে অ-এএসসিআইআই অক্ষর রয়েছে তাদের সকলের জন্য এই উত্তরটি কেবলমাত্র মিথ্যা এবং বিভ্রান্তিকর।
টিএনটি

-3

এটি আমার জন্য কাজ করে ("ইউটিএফ 8" এর পরিবর্তে "ডিফল্ট" ব্যবহার করুন):

$MyFile = Get-Content $MyPath
$MyFile | Out-File -Encoding "Default" $MyPath

ফলাফল বিওএম ছাড়াই এএসসিআইআই।


1
প্রতি আউট-ফাইলের ডকুমেন্টেশন উল্লেখ Defaultএনকোডিং, সিস্টেমের বর্তমান ANSI কোড পৃষ্ঠা, যা হল UTF-8 নয় ব্যবহার করবে আমি প্রয়োজন।
এম ডুডলি

এটি আমার পক্ষে কমপক্ষে রফতানি-সিএসভি-র জন্য কাজ করে বলে মনে হচ্ছে। আপনি যদি একটি সঠিক সম্পাদক ফলে ফাইল খোলার পারেন, ফাইল এনকোডিং BOM ছাড়া হল UTF-8 এবং পশ্চিম ল্যাটিন আইএসও 9 হিসাবে আমি সঙ্গে হওয়া ASCII প্রত্যাশিত যেত না
eythort

অনেক সম্পাদক যদি এনকোডিং সনাক্ত করতে না পারে তবে ফাইলটি ইউটিএফ -8 হিসাবে খোলেন।
খালি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.