Das Grundproblem: jeder Befehl eine andere Kodierung
In Windows PowerShell 5.1 hat fast jeder Befehl seine eigene Standardkodierung: Get-Content liest Dateien ohne BOM als ANSI (Windows-1252), Out-File und > schreiben UTF-16, Set-Content schreibt ANSI und Export-Csv ASCII. PowerShell 7 hat das vereinheitlicht und nutzt überall UTF-8 ohne BOM.
Vorher
Benutzer;Abteilung;Standort Jörg Weiß;Vertrieb;München Renée Groß;Einkauf;Köln
Nachher
Benutzer;Abteilung;Standort Jörg Weiß;Vertrieb;München Renée Groß;Einkauf;Köln
Dateien richtig lesen und schreiben
Get-Content daten.csv -Encoding UTF8liest UTF-8-Dateien auch ohne BOM richtig.Set-Content,Out-FileundAdd-Contentschreiben mit-Encoding UTF8UTF-8 – in 5.1 immer mit BOM.Export-Csv daten.csv -Encoding UTF8 -NoTypeInformationstatt des ASCII-Standards, der Umlaute durch?ersetzt.- Für alle Befehle auf einmal:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'am Anfang des Skripts.
Webanfragen mit Invoke-RestMethod und Invoke-WebRequest
Gibt ein Server im Content-Type keinen Zeichensatz an, dekodiert Windows PowerShell 5.1 die Antwort als ISO-8859-1. UTF-8-Antworten enthalten dann ä. Abhilfe: die Antwort als Bytes holen und selbst dekodieren, etwa mit [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
Skriptdateien mit Umlauten
Speicherst du ein Skript als UTF-8 ohne BOM, liest Windows PowerShell 5.1 es als ANSI. Umlaute in Texten wie Write-Host "Größe" erscheinen dann als Größe. Speichere .ps1-Dateien deshalb als UTF-8 mit BOM – in VS Code über die Kodierung unten rechts, in Notepad++ über Kodierung → UTF-8-BOM.
Die Konsole
Zeigt nur das Konsolenfenster falsche Zeichen, ist die Datei oft in Ordnung. Stelle die Ausgabe mit [Console]::OutputEncoding = [Text.Encoding]::UTF8 um. Für Ausgaben, die du an externe Programme weitergibst, gilt zusätzlich $OutputEncoding = [Text.Encoding]::UTF8.
Ist die Datei schon kaputt geschrieben, zieh sie oben hinein: Mojibuster repariert ä und Co. und wandelt ANSI-Dateien in UTF-8 um. Stehen schon Fragezeichen in der Datei, ist der Text verloren – siehe Fragezeichen statt Umlaute.
Häufige Fragen
Welche PowerShell-Version habe ich?
$PSVersionTable.PSVersion zeigt sie an. 5.1 ist die in Windows eingebaute Windows PowerShell, ab 7 heißt sie nur noch PowerShell und nutzt UTF-8 als Standard.
Warum öffnet Excel meine CSV aus PowerShell falsch?
PowerShell 7 schreibt UTF-8 ohne BOM, das erkennt Excel nicht. Nutze -Encoding utf8BOM oder speichere die Datei in Mojibuster mit BOM. Mehr unter Excel zeigt Umlaute falsch.
Brauche ich chcp 65001?
Nur für Programme, die sich nach der Codepage der Konsole richten. Innerhalb von PowerShell reicht [Console]::OutputEncoding.