注:以下はWindowsPowerShellに適用されます。
参照してください。次のセクションで、クロスプラットフォームのためのPowerShellコア(V6 +)版。
オンPSv5.1以上、>
かつ>>
効果的の別名であるOut-File
あなたがすることができ、デフォルトのエンコーディングを設定するための>
/ >>
/Out-File
経由で$PSDefaultParameterValues
設定変数:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
上PSv5.0以下、あなたがすることができないのエンコードを変更>
/>>
、しかし、上PSV3以上、上記の技術ではありませんへの明示的な呼び出しのための作業をOut-File
。
($PSDefaultParameterValues
設定変数はPSv3.0で導入されました)。
オンPSv3.0以上、あなたがしたい場合のためにエンコードするデフォルト設定のすべてのサポートのコマンドレットのパラメーターを
-Encoding
(PSv5.1 +に含まれている>
と>>
)、使用:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
あなたはあなたの中にこのコマンドを配置する場合$PROFILE
など、コマンドレットなどOut-File
とSet-Content
、これはそれ作ることをデフォルトでエンコードUTF-8が、ノートを使用するセッション・グローバル設定明示的にエンコーディングを指定していないすべてのコマンド/スクリプトに影響を与えます。
同様に、同じように動作させたいスクリプトまたはモジュールにそのようなコマンドを含めるようにしてください。そうすれば、別のユーザーや別のマシンで実行した場合でも、実際に同じように動作します。
警告:PowerShellは、V5.1のように、必ず_with UTF-8のファイルを作成します(擬似)BOM_だけでは通例である、のWindowsの世界- Unixのユーティリティは、このBOMを(下参照)を認識しないベース。BOMのないUTF-8ファイルを作成する回避策については、この投稿を参照してください。
以下のためのWindows PowerShellコマンドレットの標準の多くの間で乱暴に矛盾するデフォルトの文字エンコーディングの動作の概要、下のセクションを参照してください。
自動$OutputEncoding
変数は無関係であり、PowerShellが外部プログラムと通信する方法(PowerShellが文字列を送信するときに使用するエンコード)にのみ適用されます。出力リダイレクト演算子とPowerShellコマンドレットがファイルに保存するために使用するエンコードとは関係ありません。
オプションの読み物:クロスプラットフォームの観点:PowerShellコア:
PowerShellは、PowerShell Coreエディションを介してクロスプラットフォームになりました。そのエンコーディングは、Unixライクなプラットフォームに沿って、デフォルトでBOMのないUTF-8になっています。
これは、BOMなしのソースコードファイルはUTF-8であると仮定されていることを意味し、使用>
/ Out-File
/Set-Content
デフォルトBOMなしUTF-8。utf8
-Encoding
引数を明示的に使用しても、BOMのないUTF-8が作成されますが、値を使用して疑似BOMを使用してファイルを作成することを選択できますutf8bom
。
UnixライクなプラットフォームのエディターでPowerShellスクリプトを作成し、最近ではVisual StudioCodeやSublimeTextなどのクロスプラットフォームエディターを使用するWindowsでも、結果の*.ps1
ファイルには通常UTF-8疑似BOMがありません。
- これは、PowerShellの上正常に動作コアを。
- ファイルに非ASCII文字が含まれている場合、WindowsPowerShellで破損する可能性があります。スクリプトで非ASCII文字を使用する必要がある場合は、BOMを使用してUTF-8として保存します。
BOMがない場合、Windows PowerShellは、スクリプトを従来の「ANSI」コードページ(Unicode以前のアプリケーションのシステムロケールによって決定されます。たとえば、米国英語システムのWindows-1252)でエンコードされていると(誤って)解釈します。
逆に、ファイルませんが、 UTF-8の疑似BOMが上問題となる可能性が持っているUnixライクなプラットフォームとして、彼らのようなUnixユーティリティ原因cat
、sed
とawk
-とのような、さらにいくつかのエディタgedit
-するを通じて疑似BOMを渡すすなわち、データとして扱います。
- これは常に問題になるとは限りませんが
bash
、たとえば、text=$(cat file)
またはを使用してファイルを文字列に読み込もうとした場合など、問題になる可能性がありtext=$(<file)
ます。結果の変数には、最初の3バイトとして疑似BOMが含まれます。
Windows PowerShellでの一貫性のないデフォルトのエンコード動作:
残念ながら、WindowsPowerShellで使用されるデフォルトの文字エンコードは非常に一貫性がありません。前のセクションで説明したように、クロスプラットフォームのPowerShell Coreエディションは、これを称賛に値する形で終わらせました。
注意:
以下は、すべての標準コマンドレットを網羅することを目的としたものではありません。
彼らのヘルプトピックを見つけるために、コマンドレットの名前をグーグルでは、今、あなたのPowerShellを示すコア・デフォルトで話題のバージョンを。左側のトピックのリストの上にあるバージョンドロップダウンリストを使用して、WindowsPowerShellバージョンに切り替えます。
この記事の執筆時点で、ドキュメントには、ASCIIがWindowsPowerShellのデフォルトのエンコーディングであると誤って記載されていることがよくあります。このGitHubドキュメントの問題を参照してください。
書くコマンドレット:
Out-File
および>
/ >>
「Unicode」を作成します-UTF-16LE-デフォルトでファイル-すべてのASCII範囲の文字(あまりにも)は2バイトで表されます-これはSet-Content
/とは著しく異なりますAdd-Content
(次のポイントを参照)。New-ModuleManifest
そしてExport-CliXml
また、UTF-16LEファイルを作成します。
Set-Content
(Add-Content
ファイルがまだ存在しない/空の場合)ANSIエンコーディング(PowerShellが呼び出すアクティブなシステムロケールのANSIレガシーコードページで指定されたエンコーディング)を使用しますDefault
。
Export-Csv
文書化されているように、実際にASCIIファイルを作成しますが、-Append
以下の注を参照してください。
Export-PSSession
デフォルトでBOMを使用してUTF-8ファイルを作成します。
New-Item -Type File -Value
現在、BOMなし(!)のUTF-8を作成しています。
Send-MailMessage
ヘルプトピックは、そのASCIIエンコーディングがデフォルトであると主張-私は個人的に請求することを確認していません。
Start-Transcript
常にBOMを使用してUTF-8ファイルを作成しますが、-Append
以下の注を参照してください。
既存のファイルに追加するコマンドを再実行します。
>>
/Out-File -Append
作らない何のファイルのエンコーディングの一致する試み既存のコンテンツを。つまり-Encoding
、オプションではない、で特に指示されない限り、デフォルトのエンコーディングを盲目的に適用します>>
($PSDefaultParameterValues
上記のように、PSv5.1 +で間接的にを除いて)。つまり、既存のファイルのコンテンツのエンコーディングを知っており、同じエンコーディングを使用して追加する必要があります。
Add-Content
称賛に値する例外です。明示的な-Encoding
引数がない場合、既存のエンコーディングを検出し、それを新しいコンテンツに自動的に適用します。ありがとう、js2010。これは、Windows PowerShellでは、既存のコンテンツにBOMがない場合に適用されるのはANSIエンコーディングであるのに対し、PowerShellCoreではUTF-8であることを意味します。
Out-File -Append
/>>
との間のこの不一致はAdd-Content
、PowerShell Coreにも影響しますが、このGitHubの問題で説明されています。
Export-Csv -Append
既存のエンコーディングと部分的に一致します。既存のファイルのエンコーディングがASCII / UTF-8 / ANSIのいずれかである場合、UTF-8を盲目的に追加しますが、UTF-16LEおよびUTF-16BEと正しく一致します。
別の言い方をすれば、BOMがない場合、Export-Csv -Append
UTF-8がそうであるAdd-Content
と仮定しますが、ANSIを仮定します。
Start-Transcript -Append
部分的には、既存のエンコーディングに一致します。それは正しくエンコーディングに一致するBOMではなく、潜在的に非可逆ASCIIへのデフォルトは1が存在しない場合にエンコードします。
読み取るコマンドレット(つまり、BOMがない場合に使用されるエンコーディング):
Get-Content
およびImport-PowerShellDataFile
ANSI(をデフォルトDefault
と一致しています)、 Set-Content
。
ANSIは、PowerShellエンジン自体がファイルからソースコードを読み取るときにデフォルトで設定されるものでもあります。
これとは対照的に、Import-Csv
、Import-CliXml
およびSelect-String
UTF-8 BOMが存在しない場合には想定しています。