Wie finde ich alle Dateien in einem Verzeichnis, die UTF-8-Stücklisten enthalten?

8

Unter Windows muss ich alle Dateien in einem Verzeichnis finden, die UTF-8 BOM (Byte Order Mark) enthalten. Welches Tool kann das und wie?

Dies kann ein PowerShell-Skript, die erweiterte Suchfunktion eines Texteditors oder was auch immer sein.

Borek Bernard
quelle

Antworten:

15

Hier ist ein Beispiel für ein PowerShell-Skript. Es sucht im C:Pfad nach Dateien, in denen sich die ersten 3 Bytes befinden 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

Ist es notwendig, "ReadAllBytes"? Vielleicht ist es besser, nur ein paar erste Bytes zu lesen?

Gutes Argument. Hier ist eine aktualisierte Version, die nur die ersten 3 Bytes liest.

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
quelle
1
Cool. Muss "ReadAllBytes" angegeben werden, bevor ich "is as the answer" ankreuze? Vielleicht ist es besser, nur ein paar erste Bytes zu lesen?
Borek Bernard
@Borek Siehe bearbeiten.
Vcsjones
2
Das hat meinen Tag gerettet! Ich habe auch gelernt, get-childitem -recurseauch mit Unterverzeichnissen umzugehen.
Diynevala
Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Stücklisten mithilfe des obigen Skripts zu entfernen.
tom_mai78101
2

Nebenbei bemerkt, hier ist ein PowerShell-Skript, mit dem ich die UTF-8-Stücklistenzeichen aus meinen Quelldateien entferne:

$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
quelle
Ich habe gerade eine Menge Dateien bekommen, die sich nur dadurch unterschieden, dass einige eine Stückliste hatten und andere nicht. Ihre Antwort war genau das, was ich brauchte, um alles aufzuräumen. Vielen Dank!
Tevya
0

Wenn Sie sich auf einem Unternehmenscomputer (wie ich) mit eingeschränkten Berechtigungen befinden und kein Powershell-Skript ausführen können, können Sie ein portables Notepad ++ mit PythonScript- Plugin verwenden, um die Aufgabe mit dem folgenden Skript auszuführen :

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

Das Guthaben geht an https://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-using-notepad/

Hoàng Long
quelle