निर्देशिका की सभी फ़ाइलों को कैसे खोजें जिसमें UTF-8 BOM (बाइट-ऑर्डर मार्क) हो?


8

विंडोज पर, मुझे सभी फाइलों को एक निर्देशिका में ढूंढना होगा जिसमें UTF-8 BOM (बाइट-ऑर्डर मार्क) हो। कौन सा उपकरण ऐसा कर सकता है और कैसे?

यह एक PowerShell स्क्रिप्ट, कुछ पाठ संपादक की उन्नत खोज सुविधा या जो कुछ भी हो सकता है।

जवाबों:


15

यहाँ एक PowerShell स्क्रिप्ट का एक उदाहरण है। यह C:किसी भी फाइल के लिए पथ में दिखता है जहां पहले 3 बाइट्स हैं 0xEF, 0xBB, 0xBF

Function ContainsBOM
{   
    return $input | where {
        $contents = [System.IO.File]::ReadAllBytes($_.FullName)
        $_.Length -gt 2 -and $contents[0] -eq 0xEF -and $contents[1] -eq 0xBB -and $contents[2] -eq 0xBF }
}

get-childitem "C:\*.*" | where {!$_.PsIsContainer } | ContainsBOM

क्या "ReadAllBytes" आवश्यक है? शायद कुछ पहले बाइट्स पढ़ने से बेहतर प्रदर्शन होगा?

निष्पक्ष बिंदु। यहां एक अद्यतन संस्करण है जो केवल पहले 3 बाइट्स को पढ़ता है।

Function ContainsBOM
{   
    return $input | where {
        $contents = new-object byte[] 3
        $stream = [System.IO.File]::OpenRead($_.FullName)
        $stream.Read($contents, 0, 3) | Out-Null
        $stream.Close()
        $contents[0] -eq 0xEF -and $contents[1] -eq 0xBB -and $contents[2] -eq 0xBF }
}

get-childitem "C:\*.*" | where {!$_.PsIsContainer -and $_.Length -gt 2 } | ContainsBOM

1
ठंडा। इससे पहले कि मैं जवाब के रूप में चिह्नित करूं, क्या यह "रीडअलीस" के लिए आवश्यक है? शायद कुछ पहले बाइट्स पढ़ने से बेहतर प्रदर्शन होगा?
बोरेक बर्नार्ड

@ बोरक देखें संपादित करें।
vcsjones

2
इससे मेरा दिन बच गया! यह भी सीखा कि get-childitem -recurseउपनिर्देशिकाओं को भी संभालना है।
डायनेवला

मुझे आश्चर्य हुआ कि क्या उपरोक्त स्क्रिप्ट का उपयोग करके BOM को हटाने का कोई तरीका है?
tom_mai78101

2

एक साइड नोट के रूप में, यहां एक PowerShell स्क्रिप्ट है जिसका उपयोग मैं अपने स्रोत फ़ाइलों से UTF-8 BOM charater (s) को हटाने के लिए करता हूं:

$files=get-childitem -Path . -Include @("*.h","*.cpp") -Recurse
foreach ($f in $files)
{
(Get-Content $f.PSPath) | 
Foreach-Object {$_ -replace "\xEF\xBB\xBF", ""} | 
Set-Content $f.PSPath
}

मुझे बस फाइलों का एक स्लीव मिला है जो केवल इस तथ्य से भिन्न था कि कुछ में बीओएम था और कुछ में नहीं था। आपका जवाब सिर्फ इतना था कि मुझे इसे साफ करने की क्या जरूरत थी। धन्यवाद!
तेजस्वी

1

यदि आप एक एंटरप्राइज़ कंप्यूटर (मेरे जैसे) प्रतिबंधित विशेषाधिकारों के साथ हैं और पॉवरशेल स्क्रिप्ट नहीं चला सकते हैं, तो आप निम्न स्क्रिप्ट के साथ, कार्य करने के लिए पायथोनस्क्रिप्ट प्लगइन के साथ एक पोर्टेबल नोटपैड ++ का उपयोग कर सकते हैं :

import os;
import sys;
filePathSrc="C:\\Temp\\UTF8"
for root, dirs, files in os.walk(filePathSrc):
    for fn in files:
      if fn[-4:] != '.jar' and fn[-5:] != '.ear' and fn[-4:] != '.gif' and fn[-4:] != '.jpg' and fn[-5:] != '.jpeg' and fn[-4:] != '.xls' and fn[-4:] != '.GIF' and fn[-4:] != '.JPG' and fn[-5:] != '.JPEG' and fn[-4:] != '.XLS' and fn[-4:] != '.PNG' and fn[-4:] != '.png' and fn[-4:] != '.cab' and fn[-4:] != '.CAB' and fn[-4:] != '.ico':
        notepad.open(root + "\\" + fn)
        console.write(root + "\\" + fn + "\r\n")
        notepad.runMenuCommand("Encoding", "Convert to UTF-8 without BOM")
        notepad.save()
        notepad.close()

क्रेडिट https://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-use-notepad/ को जाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.