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.
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.
Jawaban:
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
get-childitem -recurse
untuk menangani subdirektori juga.
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
}
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/