दिलचस्प पोस्ट
कैसे MFMailComposeViewController दिखाए बिना iPhone अनुप्रयोग से मेल भेजने के लिए? Windows FINDSTR कमांड के अपठित सुविधाओं और सीमाएं क्या हैं? अजगर में वेटेड रैंडम नमूना डेटा संरचनाएं जो किसी कुंजी की एक श्रेणी को मैप में मैप कर सकती हैं स्थानीय मूल्यों के लिए पायथन लैम्ब्डा बाध्यकारी है कार्यक्रम से बाहर निकलने से पहले कुछ करना सी # अग्रवाल वक्तव्य में परिवर्तन चरणीय केवल-पढ़ने के लिए क्यों है? Server.UrlEncode बनाम HttpUtility.UrlEncode मैं CPU और RAM उपयोग PowerShell का उपयोग कैसे करूं? AngularAMD + UI- राउटर + डायनेमिक नियंत्रक नाम? संदर्भ चर वस्तु में शाब्दिक? क्या मेरे PHP फ़ंक्शन तर्कों की एक सरणी स्वीकार करते हैं या मुझे स्पष्ट रूप से तर्कों का अनुरोध करना चाहिए? .htaccess का उपयोग कर HTTP और HTTPS के बीच सही ढंग से स्विच करना क्यों प्रदर्शन के लिए वजन नीडि़त खराब है? वैकल्पिक? स्वचालित रूप से सिस्टम पुनरारंभ पर हमेशा (नोड) प्रारंभ करें

बीओएम के बिना यूटीएफ -8 में एक फाइल लिखने के लिए PowerShell का उपयोग करना

Out-File UTF-8 का उपयोग करते समय BOM को लागू करने लगता है:

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

मैं PowerShell का उपयोग करके कोई BOM के साथ UTF-8 में एक फाइल कैसे लिख सकता / सकती हूं?

Solutions Collecting From Web of "बीओएम के बिना यूटीएफ -8 में एक फाइल लिखने के लिए PowerShell का उपयोग करना"

.NET के UTF8Encoding क्लास का UTF8Encoding करना और निर्माता को $False गुजरना काम करने लगता है:

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

@ मे को टिप्पणियों में @ रौमन कुज़मिन द्वारा सुझाए गए समाधान का उपयोग करने का अब उचित तरीका है डुडले का उत्तर :

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

(मैंने इसे अनावश्यक System नेमस्पेस स्पष्टीकरण छीनकर इसे थोड़ा छोटा कर दिया है – इसे डिफ़ॉल्ट रूप से स्वचालित रूप से प्रतिस्थापित किया जाएगा।)

मुझे लगा कि यह यूटीएफ नहीं होगा, लेकिन मुझे एक बहुत ही आसान समाधान मिल गया जो काम करने लगता है …

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

मेरे लिए यह बोफो फ़ाइल के बिना utf-8 में होता है, स्रोत प्रारूप के बावजूद।

एम। डडली के अपने सरल और व्यावहारिक उत्तर (और फॉर एनवीवीआर के अधिक संक्षिप्त सुधार ) के पूरक के लिए :

सुविधा के लिए, यहां उन्नत फ़ंक्शन 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) # Caveat: .NET Core doesn'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() } } 

यह स्क्रिप्ट, यूओटीएफ -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); } 

एक तकनीक जो मैं उपयोग करता हूं, आउटपुट फ़ाइल सेमेडलेट का उपयोग करके एक एएससीआईआई फ़ाइल को आउटपुट को रीडायरेक्ट करना है।

उदाहरण के लिए, मैं अक्सर एसक्यूएल स्क्रिप्ट चलाता हूं जो ओरेकल में निष्पादित करने के लिए एक और एसक्यूएल स्क्रिप्ट बनाता है। सरल रीडायरेक्शन (">") के साथ, आउटपुट UTF-16 में होगा जो कि एसक्यूएलप्लस द्वारा मान्यता प्राप्त नहीं है इस के आसपास काम करने के लिए:

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

किसी भी यूनिकोड चिंताओं के बिना किसी अन्य SQLPlus सत्र के जरिए उत्पन्न लिपि को निष्पादित किया जा सकता है:

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

BOM के बिना यूटीएफ -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) } 

जो भी कारण, WriteAllLines कॉल अभी भी मेरे लिए एक BOM उत्पादन कर रहे थे, BOMless UTF8Encoding तर्क के साथ और इसके बिना। लेकिन निम्नलिखित मेरे लिए काम किया:

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

मुझे इसके लिए काम करने के लिए फ़ाइल पथ पूर्ण करना था अन्यथा यह फाइल मेरे डेस्कटॉप पर लिखा है। इसके अलावा, मुझे लगता है कि यह केवल काम करता है अगर आपको पता है कि आपका बॉम 3 बाइट है मुझे नहीं पता है कि एन्कोडिंग के आधार पर दिए गए BOM प्रारूप / लंबाई की अपेक्षा करना कितना विश्वसनीय है।

इसके अलावा, लिखित रूप में, यह शायद केवल तभी काम करता है यदि आपकी फ़ाइल एक शक्तिशैली सरणी में फिट हो जाती है, जो कि मेरी मशीन पर [int32]::MaxValue से कम कुछ मान की लंबाई सीमा है।

  [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" } 

स्रोत PowerShell का उपयोग कर फ़ाइल से UTF8 बाइट ऑर्डर मार्क (BOM) को कैसे निकालें

यदि आप [System.IO.File]::WriteAllLines() का उपयोग करना चाहते हैं, तो आपको String[] दूसरा पैरामीटर डालना चाहिए (यदि $MyFile का प्रकार Object[] ), और $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($MyPath) साथ पूर्ण पथ निर्दिष्ट करें $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 | | 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 साथ Set-Content -Encoding Byte उपयोग कर सकते हैं:

 $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) 

देखें: BOM के बिना यूटीएफ -8 में फ़ाइल को कन्वर्ट-सीएसवी का परिणाम कैसे लिखना

BOM बिना UTF8 प्राप्त करने के लिए नीचे का उपयोग कर सकते हैं

 $MyFile | Out-File -Encoding ASCII 

यह मेरे लिए काम करता है ("UTF8" के बजाय "डिफ़ॉल्ट" का उपयोग करें):

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

परिणाम BOM बिना ASCII है