วิธีค้นหาไฟล์ทั้งหมดในไดเรกทอรีที่มี UTF-8 BOM (เครื่องหมายคำสั่งซื้อ)


8

บน Windows ฉันต้องค้นหาไฟล์ทั้งหมดในไดเรกทอรีที่มี 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
เย็น. ก่อนที่ฉันจะทำเครื่องหมายว่าเป็นคำตอบจำเป็นหรือไม่ที่ "ReadAllBytes" บางทีการอ่านเพียงไม่กี่ไบต์แรกจะทำงานได้ดีขึ้นหรือไม่
Borek Bernard

@Borek ดูการแก้ไข
vcsjones

2
สิ่งนี้ช่วยชีวิตฉันไว้! ยังได้เรียนรู้ที่get-childitem -recurseจะจัดการกับไดเรกทอรีย่อยอีกด้วย
diynevala

ฉันสงสัยว่ามีวิธีลบ BOM โดยใช้สคริปต์ด้านบนหรือไม่
tom_mai78101

2

นี่คือสคริปต์ PowerShell ที่ฉันใช้ในการตัดอักขระที่เป็น UTF-8 BOM ออกจากไฟล์ต้นฉบับของฉัน:

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

ฉันเพิ่งได้รับไฟล์ที่แตกต่างกันโดยเฉพาะความจริงที่ว่าบางคนมี BOM และบางคนไม่ได้ คำตอบของคุณคือสิ่งที่ฉันต้องการในการทำความสะอาดทั้งหมด ขอบคุณ!
Tevya

1

หากคุณใช้คอมพิวเตอร์แบบองค์กร (เช่นฉัน) ที่มีสิทธิ์แบบ จำกัด และไม่สามารถเรียกใช้สคริปต์ PowerShell คุณสามารถใช้ Notepad ++ ที่พกพาได้พร้อมปลั๊กอินPythonScriptเพื่อทำงานโดยใช้สคริปต์ต่อไปนี้:

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-using-notepad/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.