Bagaimana menemukan semua file dalam direktori yang mengandung UTF-8 BOM (tanda byte-order)?

8

Di Windows, saya perlu menemukan semua file dalam direktori yang berisi UTF-8 BOM (tanda byte-order). Alat mana yang bisa melakukan itu dan bagaimana caranya?

Ini bisa berupa skrip PowerShell, fitur pencarian lanjutan editor teks atau apa pun.

Borek Bernard
sumber

Jawaban:

15

Berikut adalah contoh skrip PowerShell. Itu terlihat di C:jalur untuk semua file di mana 3 byte pertama berada 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

Apakah perlu "ReadAllBytes"? Mungkin membaca hanya beberapa byte pertama akan lebih baik?

Titik adil. Ini adalah versi terbaru yang hanya membaca 3 byte pertama.

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
vcsjones
sumber
1
Keren. Sebelum saya tandai sebagai jawabannya, perlukah "ReadAllBytes"? Mungkin membaca hanya beberapa byte pertama akan lebih baik?
Borek Bernard
@Borek Lihat edit.
vcsjones
2
Ini menyelamatkan hari saya! Juga belajar bahwa get-childitem -recurseuntuk menangani subdirektori juga.
diynevala
Saya bertanya-tanya apakah ada cara untuk menghapus BOM menggunakan skrip di atas?
tom_mai78101
2

Sebagai catatan, berikut ini adalah skrip PowerShell yang saya gunakan untuk menghapus karakter UTF-8 BOM dari file sumber saya:

$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
}
Scott Smith
sumber
Saya baru saja mendapatkan banyak file yang berbeda hanya dengan fakta bahwa beberapa memiliki BOM dan beberapa tidak. Jawaban Anda adalah apa yang saya butuhkan untuk membersihkan semuanya. Terima kasih!
Tevya
1

Jika Anda menggunakan komputer perusahaan (seperti saya) dengan hak istimewa terbatas dan tidak dapat menjalankan skrip PowerShell, Anda dapat menggunakan Notepad portabel dengan plugin PythonScript untuk melakukan tugas, dengan skrip berikut:

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

Kredit diberikan ke https://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-using-notepad/

Hoàng Long
sumber