Làm cách nào để tìm tất cả các tệp trong thư mục chứa UTF-8 BOM (dấu thứ tự byte)?


8

Trên Windows, tôi cần tìm tất cả các tệp trong thư mục chứa UTF-8 BOM (dấu thứ tự byte). Công cụ nào có thể làm điều đó và làm thế nào?

Nó có thể là tập lệnh PowerShell, một số tính năng tìm kiếm nâng cao của trình soạn thảo văn bản hoặc bất cứ điều gì.

Câu trả lời:


15

Dưới đây là một ví dụ về tập lệnh PowerShell. Nó tìm trong C:đường dẫn cho bất kỳ tệp nào có 3 byte đầu tiên 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

Có cần thiết phải "ReadAllBytes" không? Có lẽ chỉ đọc một vài byte đầu tiên sẽ hoạt động tốt hơn?

Điểm công bằng. Đây là một phiên bản cập nhật chỉ đọc 3 byte đầu tiên.

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
Mát mẻ. Trước khi tôi đánh dấu là câu trả lời, có cần thiết phải "ReadAllBytes" không? Có lẽ chỉ đọc một vài byte đầu tiên sẽ hoạt động tốt hơn?
Borek Bernard

@Borek Xem chỉnh sửa.
vcsjones

2
Điều này đã cứu ngày của tôi! Cũng học được rằng get-childitem -recurseđể xử lý các thư mục con là tốt.
diynevala

Tôi tự hỏi liệu có cách nào để loại bỏ các BOM bằng cách sử dụng tập lệnh trên không?
tom_mai78101

2

Như một lưu ý phụ, đây là tập lệnh PowerShell mà tôi sử dụng để loại bỏ (các) charater BOM UTF-8 khỏi các tệp nguồn của mình:

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

Tôi chỉ có một loạt các tệp khác nhau bởi thực tế là một số có BOM và một số thì không. Câu trả lời của bạn chỉ là những gì tôi cần để làm sạch tất cả. Cảm ơn bạn!
Tevya

1

Nếu bạn đang sử dụng máy tính doanh nghiệp (như tôi) với các đặc quyền bị hạn chế và không thể chạy tập lệnh powershell, bạn có thể sử dụng một Notepad ++ di động với plugin PythonScript để thực hiện tác vụ, với tập lệnh sau:

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

Tín dụng truy cập https://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-USE-notepad/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.