Powershellでスクリプトを作っていると結構困らされるのが文字コードの問題です。CSVを読み込んで加工後に書き出すであるとか、複数のCSVをマージするという作業ではスクリプトがよく使われるところだと思いますが、読み込むCSVと書き出すCSVの文字コードが異なると文字化けが起きる場合があります。
CSVの読み込みにImport-CSV、書き出しにExport-CSVを使う場合、コマンドレットで文字コードを明示的に指定することで問題を回避できます。
Microsoftのドキュメントによれば、Powershell7.1以降であれば以下の内容で文字コードを明示的に指定できるということです。
[Microsoft Learn]
上記ドキュメントの内容を踏まえてImport-CSVでShift-JISのCSVを読み込む場合、例えば以下のようなコマンドで読み込むことが可能です。
[Powershell]
#$csvFileは読み込むCSVファイルのファイル名を含むフルパス
Import-Csv -Path $csvFile.FullName -Encoding oem
文字エンコードoemというのは”MS-DOS およびコンソール プログラムの既定のエンコードを使用します。”ということですので、日本語Windowsを使っている場合、デフォルトではShift-JISです。
確認する場合はコマンドプロンプトを開き、”chcp”と入力します。”932”という値が返ってきた場合、Shift-JISに設定されています。
書き出す時にも明示的に文字エンコードが指定できるので、例えばUTF-8(BOMなし)にしたい場合は以下のようなコードで出力可能です。
[Powershell]
#$outputFileNameは書き出すCSVファイルのファイル名を含むフルパス
Export-Csv -Path $outputFileName -NoTypeInformation -Encoding utf8NoBOM
少々厄介なのはこの文字エンコードの指定方法がPowershellのバージョンによって異なることです。Powershellで何か作る場合はとりあえず最新版にしておくと、Microsoftのドキュメントと食い違いがなくなって良いと思います。