Hinweis: Für Windows PowerShell gilt Folgendes .
Im nächsten Abschnitt finden Sie die plattformübergreifende PowerShell Core (v6 +) Edition.
Auf PSv5.1 oder höher , wo >
und >>
effektiv Aliase sind Out-File
, können Sie die Standardcodierung für Set >
/ >>
/ Out-File
über die $PSDefaultParameterValues
Einstellungsvariablen :
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
Auf PSv5.0 oder unten , Sie nicht kann die Codierung für ändern >
/>>
, aber auf PSV3 oder höher , die obige Technik tut Arbeit für explizite AnrufeOut-File
.
(Die $PSDefaultParameterValues
Präferenzvariable wurde in PSv3.0 eingeführt.)
Auf PSv3.0 oder höher , wenn Sie wollen die Standardeinstellung für die Codierung aller Cmdlets, unterstützen
einen -Encoding
Parameter (die in PSv5.1 + enthält >
und >>
), zu verwenden:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
Wenn Sie diesen Befehl in Ihre$PROFILE
Cmdlets einfügen, z. B. Out-File
undSet-Content
verwenden standardmäßig die UTF-8-Codierung. Beachten Sie jedoch, dass dies eine sitzungsglobale Einstellung ist , die sich auf alle Befehle / Skripte auswirkt, die keine explizite Codierung angeben.
Stellen Sie in ähnlicher Weise sicher, dass Sie solche Befehle in Ihre Skripte oder Module aufnehmen, die sich genauso verhalten sollen , damit sie sich auch dann gleich verhalten, wenn sie von einem anderen Benutzer oder einem anderen Computer ausgeführt werden.
Vorsichtsmaßnahme : PowerShell ab Version 5.1, ausnahmslos UTF-8-Dateien mit einer (Pseudo-) Stückliste , was nur in der Windows- Weltüblich ist. Unix- basierte Dienstprogramme erkennen diese Stückliste nicht (siehe unten). In diesem Beitrag finden Sie Problemumgehungen, mit denen UTF-8-Dateien ohne Stückliste erstellt werden.
Eine Zusammenfassung des äußerst inkonsistenten Standard-Zeichencodierungsverhaltens in vielen Windows PowerShell-Standard-Cmdlets finden Sie im unteren Abschnitt.
Die automatische $OutputEncoding
Variable hat keine Beziehung zueinander und gilt nur für die Kommunikation von PowerShell mit externen Programmen (welche Codierung PowerShell beim Senden von Zeichenfolgen an diese verwendet). Sie hat nichts mit der Codierung zu tun, die die Ausgabeumleitungsoperatoren und PowerShell-Cmdlets zum Speichern in Dateien verwenden.
Optionales Lesen: Die plattformübergreifende Perspektive: PowerShell Core :
PowerShell ist jetzt über seinen PowerShell Core plattformübergreifend Edition, deren Codierung - sinnvollerweise - standardmäßig UTF-8 ohne Stückliste gemäß Unix-ähnlichen Plattformen verwendet.
Dies bedeutet , dass Sourcecode - Dateien ohne BOM angenommen werden UTF-8, und mit sein >
/ Out-File
/ Set-Content
Standardwert BOM-weniger UTF-8; explizite Verwendung derutf8
-Encoding
Arguments wird auch UTF-8 ohne Stückliste erstellt. Sie können jedoch auch Dateien mit der Pseudo-Stückliste mit dem utf8bom
Wert erstellen .
Wenn Sie PowerShell-Skripte mit einem Editor auf einer Unix-ähnlichen Plattform erstellen und heutzutage sogar auf Windows mit plattformübergreifenden Editoren wie Visual Studio Code und Sublime Text *.ps1
erstellen , enthält die resultierende Datei normalerweise keine UTF-8-Pseudo-Stückliste:
- Dies funktioniert gut mit PowerShell Core .
- Unter Windows PowerShell kann es zu Problemen kommen , wenn die Datei Nicht-ASCII-Zeichen enthält. Wenn Sie in Ihren Skripten Nicht-ASCII-Zeichen verwenden müssen, speichern Sie diese als UTF-8 mit Stückliste .
Ohne die Stückliste interpretiert Windows PowerShell Ihr Skript (falsch) als in der alten "ANSI" -Codepage codiert (bestimmt durch das Systemgebietsschema für Anwendungen vor Unicode, z. B. Windows-1252 auf US-englischen Systemen).
Im Gegensatz dazu werden Dateien , die zu tun haben den UTF-8 pseudo-BOM problematisch sein kann , auf Unix-ähnliche Plattformen, da sie Ursache Unix - Dienstprogramme wie cat
, sed
und awk
- und sogar einige Editoren wie gedit
- zu dem Pseudo-BOM passieren , das heißt, um es als Daten zu behandeln .
- Dies ist möglicherweise nicht immer ein Problem, kann es aber definitiv sein, z. B. wenn Sie versuchen, eine Datei in eine Zeichenfolge
bash
mit beispielsweise text=$(cat file)
oder zu lesentext=$(<file)
- der resultierenden Variable , die den Pseudo-BOM als das ersten 3 Bytes enthalten.
Inkonsistentes Standardcodierungsverhalten in Windows PowerShell :
Leider ist die in Windows PowerShell verwendete Standardzeichencodierung äußerst inkonsistent. die plattformübergreifende PowerShell Core Edition, wie im vorherigen Abschnitt erläutert, hat dies lobenswerterweise beendet.
Hinweis:
Das Folgende strebt nicht an, abzudecken alle Standard-Cmdlets .
Wenn Sie Cmdlet-Namen googeln, um ihre Hilfethemen zu finden, wird Ihnen standardmäßig die PowerShell Core- Version der Themen angezeigt. Verwenden Sie die Versions-Dropdown-Liste über der Liste der Themen auf der linken Seite, um zu einer Windows PowerShell- Version zu wechseln .
Zum jetzigen Zeitpunkt wird in der Dokumentation häufig fälschlicherweise behauptet, dass ASCII die Standardcodierung in Windows PowerShell ist - siehe dieses Problem mit GitHub-Dokumenten .
Cmdlets, die schreiben :
Out-File
und >
/ >>
" standardmäßig " Unicode "- UTF-16LE - Dateien erstellen - in denen jedes ASCII-Bereichszeichen (auch) durch 2 Bytes dargestellt wird - was sich erheblich von Set-Content
/ unterscheidet Add-Content
(siehe nächster Punkt);New-ModuleManifest
und Export-CliXml
erstellen Sie auch UTF-16LE-Dateien.
Set-Content
(und Add-Content
wenn die Datei noch nicht vorhanden ist / leer ist) verwendet die ANSI-Codierung (die Codierung, die in der ANSI-Legacy-Codepage des aktiven Systemgebietsschemas angegeben ist, die PowerShell aufruftDefault
).
Export-Csv
erstellt zwar ASCII-Dateien, wie dokumentiert, siehe jedoch die Hinweise zu -Append
.
Export-PSSession
Erstellt standardmäßig UTF-8-Dateien mit Stückliste.
New-Item -Type File -Value
Derzeit wird UTF-8 ohne Stückliste (!) erstellt.
Das Send-MailMessage
Hilfethema behauptet auch, dass die ASCII-Codierung die Standardeinstellung ist - ich habe diese Behauptung nicht persönlich überprüft.
Zu Befehlen, die an eine vorhandene Datei angehängt werden:
>>
Ich Out-File -Append
mache keinen Versuch, die Codierung des vorhandenen Inhalts einer Datei abzugleichen . Das heißt, sie wenden blind ihre Standardcodierung an, sofern nicht anders angegeben -Encoding
, was keine Option ist >>
(außer indirekt in PSv5.1 + über $PSDefaultParameterValues
, wie oben gezeigt). Kurz gesagt: Sie müssen die Codierung des Inhalts einer vorhandenen Datei kennen und mit derselben Codierung anhängen.
Add-Content
ist die lobenswerte Ausnahme: Wenn kein explizites -Encoding
Argument vorliegt, erkennt es die vorhandene Codierung und wendet sie automatisch auf den neuen Inhalt an. Danke, js2010 . Beachten Sie, dass dies in Windows PowerShell bedeutet, dass die ANSI-Codierung angewendet wird, wenn der vorhandene Inhalt keine Stückliste enthält, während es sich in PowerShell Core um UTF-8 handelt.
Diese Inkonsistenz zwischen Out-File -Append
/ >>
und Add-Content
, die sich auch auf PowerShell Core auswirkt , wird in diesem GitHub-Problem erläutert .
Export-Csv -Append
Teilweise mit der vorhandenen Codierung übereinstimmend: UTF-8 wird blind angehängt, wenn die Codierung der vorhandenen Datei ASCII / UTF-8 / ANSI ist, aber korrekt mit UTF-16LE und UTF-16BE übereinstimmt.
Anders ausgedrückt: In Abwesenheit einer Stückliste wird Export-Csv -Append
UTF-8 angenommen, während Add-Content
ANSI angenommen wird.
Cmdlets, die lesen (Codierung ohne Stückliste):
Get-Content
und Import-PowerShellDataFile
standardmäßig ANSI ( Default
), was mit übereinstimmt Set-Content
.
ANSI ist auch das, was die PowerShell-Engine selbst standardmäßig verwendet, wenn sie Quellcode aus Dateien liest .
Im Gegensatz dazu Import-Csv
, Import-CliXml
und Select-String
davon ausgehen , UTF-8 in Abwesenheit einer Stückliste.
>
/>>
wurden effektive Aliase fürOut-File
in 5.1?$PSDefaultParameterValues
Um kurz zu sein, verwenden Sie:
quelle