📝 XML-Dateien in UTF-8 ohne BOM konvertieren (PowerShell, optimiert)¶
Zweck¶
Dieses Skript konvertiert XML-Dateien nur dann, wenn sie tatsächlich konvertiert werden müssen: - Wenn die Datei UTF-16 ist. - Wenn die Datei UTF-8 mit BOM ist.
Dateien, die bereits UTF-8 ohne BOM sind, werden nicht neu geschrieben → schneller bei großen Datenmengen.
Optimiertes PowerShell-Skript¶
Param (
[Parameter(Mandatory = $True)]
[String]$SourcePath
)
# Prüfen, ob wir PowerShell 7+ verwenden
$IsPwsh7 = $PSVersionTable.PSVersion.Major -ge 7
# Alle XML-Dateien rekursiv suchen
Get-ChildItem -Path $SourcePath -Recurse -Include *.xml | ForEach-Object {
# Datei als Bytes laden, um Encoding zu erkennen
$bytes = [System.IO.File]::ReadAllBytes($_.FullName)
# Prüfen auf UTF-8 BOM (EF BB BF)
$hasBom = $bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF
# Prüfen auf UTF-16 BOM (FF FE oder FE FF)
$isUtf16 = ($bytes.Length -ge 2 -and
(($bytes[0] -eq 0xFF -and $bytes[1] -eq 0xFE) -or ($bytes[0] -eq 0xFE -and $bytes[1] -eq 0xFF)))
# Überspringen, wenn weder UTF-16 noch UTF-8-BOM
if (-not $hasBom -and -not $isUtf16) {
Write-Host "Übersprungen: $($_.FullName)"
return
}
# Inhalt als String laden
$content = Get-Content -Path $_.FullName -Raw
# XML-Header-Encoding korrigieren
$newContent = $content -replace '(?<=<\?xml\s+version="1\.0"\s+encoding=")([^"]+)', 'UTF-8'
if ($IsPwsh7) {
# PowerShell 7+ → BOM-frei speichern
Set-Content -Path $_.FullName -Value $newContent -Encoding utf8NoBOM
}
else {
# Windows PowerShell 5.1 → UTF-8 ohne BOM via .NET-API
$utf8NoBom = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllText($_.FullName, $newContent, $utf8NoBom)
}
Write-Host "Konvertiert: $($_.FullName)"
}
Funktionsweise¶
- Dateien finden → Alle XML-Dateien werden rekursiv durchsucht.
- Encoding prüfen → BOM wird über Rohdaten ermittelt.
- Nur notwendige Konvertierungen → Spart Zeit und unnötige Schreibvorgänge.
- XML-Header korrigieren →
encoding="UTF-8"wird automatisch gesetzt. - Dateien ohne BOM speichern.
Beispiel¶
Vorher (UTF-16 mit BOM):
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<root>
<value>Hello</value>
</root>
Nachher (UTF-8 ohne BOM):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<value>Hello</value>
</root>
Verwendung¶
.\Convert-XmlToUtf8_Optimized.ps1 -SourcePath "C:\Projekte\XML"
Vorteile dieser Version¶
- ✅ Prüft BOM und Encoding vor der Konvertierung
- ✅ Bearbeitet nur betroffene Dateien
- ✅ Spart Schreibvorgänge → schneller
- ✅ Funktioniert mit Windows PowerShell 5.1 und PowerShell 7+
Hinweise¶
- Originaldateien werden überschrieben → ggf. vorher Backup anlegen:
powershell Copy-Item $SourcePath "$SourcePath\Backup" -Recurse - Kann bei Bedarf leicht für weitere Dateitypen angepasst werden.