Як знайти всі файли в каталозі, які містять BT UTF-8 (байт-порядок)?


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 Див. Редагувати.
vcsjones

2
Це врятувало мені день! Також дізнався, що get-childitem -recurseтакож обробляти підкаталоги.
dinenevala

Мені було цікаво, чи є спосіб видалити 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, а деякі ні. Ваша відповідь була саме тим, що мені потрібно було, щоб усе це почистити. Дякую!
Тевія

1

Якщо ви працюєте на корпоративному комп’ютері (як я) з обмеженими привілеями і не можете запустити скрипт powerhell, ви можете використовувати портативний 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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.