Como encontrar todos os arquivos no diretório que contêm BOM UTF-8 (marca de ordem de byte)?

8

No Windows, preciso encontrar todos os arquivos em um diretório que contenha a lista de materiais UTF-8 (marca de ordem de bytes). Qual ferramenta pode fazer isso e como?

Pode ser um script do PowerShell, um recurso de pesquisa avançada do editor de texto ou qualquer outra coisa.

    
por Borek Bernard 30.04.2012 / 02:33

3 respostas

13

Este é um exemplo de script do PowerShell. Ele procura no caminho C: para todos os arquivos em que os primeiros 3 bytes são 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

Is it necessary to "ReadAllBytes"? Maybe reading just a few first bytes would perform better?

Ponto justo. Aqui está uma versão atualizada que apenas lê os primeiros 3 bytes.

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
    
por 30.04.2012 / 03:01
1

Como nota a seguir, aqui está um script do PowerShell que eu uso para remover os caracteres da BOM UTF-8 dos meus arquivos de origem:

$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
}
    
por 25.02.2015 / 19:21
0

Se você estiver em um computador corporativo (como eu) com privilégios restritos e não puder executar o script do powershell, será possível usar um Notepad ++ portátil com PythonScript plugin para fazer a tarefa, com o seguinte script:

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

O crédito vai para link

    
por 13.05.2015 / 09:19