Comment trouver tous les fichiers du répertoire contenant la nomenclature UTF-8 (marque d'ordre des octets)?

8

Sous Windows, je dois trouver tous les fichiers dans un répertoire contenant la nomenclature UTF-8 (marque d'ordre des octets). Quel outil peut le faire et comment?

Il peut s'agir d'un script PowerShell, de la fonction de recherche avancée d'un éditeur de texte ou autre.

Borek Bernard
la source

Réponses:

15

Voici un exemple de script PowerShell. Il recherche dans le C:chemin les fichiers contenant les 3 premiers octets 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

Est-il nécessaire de "ReadAllBytes"? Peut-être que lire quelques premiers octets donnerait de meilleurs résultats?

Bon point. Voici une version mise à jour qui ne lit que les 3 premiers octets.

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
la source
1
Cool. Avant de marquer est comme réponse, est-il nécessaire de "ReadAllBytes"? Peut-être que lire quelques premiers octets donnerait de meilleurs résultats?
Borek Bernard
@Borek Voir modifier.
vcsjones
2
Cela m'a sauvé la journée! J'ai également appris que get-childitem -recursepour gérer également les sous-répertoires.
diynevala
Je me demandais s'il y avait un moyen de supprimer les nomenclatures en utilisant le script ci-dessus?
tom_mai78101
2

En guise de remarque, voici un script PowerShell que j'utilise pour supprimer le (s) caractère (s) de nomenclature UTF-8 de mes fichiers source:

$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
la source
Je viens de recevoir une multitude de fichiers qui ne diffèrent que par le fait que certains avaient une nomenclature et d'autres pas. Votre réponse était exactement ce dont j'avais besoin pour tout nettoyer. Je vous remercie!
Tevya
1

Si vous êtes sur un ordinateur d'entreprise (comme moi) avec des privilèges restreints et ne pouvez pas exécuter le script PowerShell, vous pouvez utiliser un bloc-notes portable ++ avec un plug- in PythonScript pour effectuer la tâche, avec le script suivant:

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

Le crédit va à https://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-using-notepad/

Hoàng Long
la source