Export-CSVで文字化けする理由
- srgia.blog - [映画]タッチでPowerShellの文字化けについて書かれています。
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でエンコーディングされることになります。
ですから全角文字も化けません。
参考
- Microsoft.PowerShell.Commands.ExportCsvCommand
- Microsoft.PowerShell.Commands.EncodingConversion
コンソールに選択肢を表示する
「$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」です。
補足
次回は、サンプルの解説を行います。