Export-CSVで文字化けする理由

- srgia.blog - [映画]タッチPowerShellの文字化けについて書かれています。

NG:文字化けする

Get-Service | Export-Csv c:\service.csv

OK:文字化けしない

Get-Service | Export-Csv c:\service.csv -encoding Default

私の環境でも同様の結果になりました。

Export-Csvコマンドレットと-encodingオプション

「encoding」オプションのデフォルト値はASCII

Export-Csvコマンドレットのencodingオプションのデフォルト値はASCIIです。
そのため「encoding」オプションを指定しない場合は、ASCIIでエンコードされるため全角文字は化けてしまいます。


ASCIIの詳細は以下を実行すると分かります。

[System.Text.Encoding]::ASCII

Defaultとは?

Defaultはシステムのデフォルトエンコーディングです。
デフォルトエンコーディングは以下を実行すると確認できます。

[System.Text.Encoding]::Default


以下は、私の環境での実行結果です。

PS C:\> [System.Text.Encoding]::Default

BodyName          : iso-2022-jp
EncodingName      : 日本語 (シフト JIS)
HeaderName        : iso-2022-jp
WebName           : shift_jis
WindowsCodePage   : 932
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 932


つまり、以下を実行するとシフトJISエンコーディングされることになります。
ですから全角文字も化けません。

Get-Service | Export-Csv c:\service.csv -encoding Default

参考

コンソールに選択肢を表示する

「$host.ui」に関する考察 - PowerShell Memoで紹介し忘れましたが、
「$host.ui」の「PromptForChoice」メソッドを利用すると、コンソールに選択肢を表示し、ユーザに選択させることができます。

実行する前にユーザの判断が必要な時に利用

例えば、「confirm」オプションを指定した際に利用されています。

PS C:\> notepad
PS C:\> Stop-Process -name notepad -confirm

確認
この操作を実行しますか?
対象 "notepad (1908)" に対して操作 "Stop-Process" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)
  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

上記は、メモ帳を起動し、確認オプション付きでメモ帳を終了させるコマンドです。

サンプル(Yes / Noを選択する)

#選択肢の作成
$typename = "System.Management.Automation.Host.ChoiceDescription"
$yes = new-object $typename("&Yes","実行する")
$no  = new-object $typename("&No","実行しない")

#選択肢コレクションの作成
$assembly= $yes.getType().AssemblyQualifiedName
$choice = new-object "System.Collections.ObjectModel.Collection``1[[$assembly]]"
$choice.add($yes)
$choice.add($no)

#選択プロンプトの表示
$answer = $host.ui.PromptForChoice("<実行確認>","実行しますか?",$choice,0)

実行すると、以下の選択肢が表示されます。

実行結果
<実行確認>
実行しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"):

ここで、いずれかを選択もしくはキャンセルをすると、結果が$answerに格納されます。
通常は、この後、分岐処理に繋げます。

「Yes」を選択する
<実行確認>
実行しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): y
PS C:\> $answer
0
  • 「Yes」or「Y」or「y」でYesを選択できます。
  • 一番左を選択した場合、戻り値は「0」です。
「No」を選択する
<実行確認>
実行しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): n
PS C:\> $answer
1
  • 「No」or「N」or「n」でNoを選択できます。
  • 左から2番目を選択した場合、戻り値は「1」です。
「ヘルプ」を選択する
<実行確認>
実行しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): ?
Y - 実行する
N - 実行しない
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"):
  • 「?」でヘルプを選択できます。
  • ヘルプを表示した後、再び選択肢入力待ちになります。
「キャンセル」する

選択肢表示中に「Ctrl + C」でキャンセルできます。

<実行確認>
実行しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): PS C:\> $answer
-1
  • 選択肢の行から改行されずにコンソールに戻ります。
  • キャンセルした場合、戻り値は「-1」です。
補足

次回は、サンプルの解説を行います。