PowerShellは、シェルスクリプトと言いつつ.NET Frameworkが使えるために完全にプログラミング言語の性質も持っています。
その気になれば、C#言語やJavaScriptの勢いで突き進む事も可能ですが、シェルスクリプトの気軽さも併せもっているのが本当に驚異。
今回は、たとえば、BOMなしUTF-8のファイルを、WindowsおなじみのShift_JISに簡単な記述で変換してみます。
$CONVF1="C:\TEMP\SAMPLE_UTF8N.DAT"
$CONVF2="C:\TEMP\SAMPLE_SJIS.DAT"
$ENC1=NEW-OBJECT System.Text.UTF8Encoding -ArgumentList @($false)
$ENC2=[System.Text.Encoding]::GetEncoding("Shift_JIS")
$DATA1=[System.IO.File]::ReadAllLines($CONVF1,$ENC1)
[System.IO.File]::WriteAllLines($CONVF2,$DATA1,$ENC2)
変数名や文字コードオブジェクトの名前は、分かりやすいように末尾1が変換前、末尾2が変換後としました。
バイトストリームクラスを使って1行づつ読んで書く・・・というのも可能ですが、単純な変換であれば、変換元のコードで一気にファイル内容を配列に読んで、変換先のコードで配列をファイルに一気に書き込む・・・でOKです。
ちなみに、BOMなしUTF-8のエンコードをしたい時は、System.Text.EncodeクラスのスタティックメソッドGetEncodingではだめなので注意が必要です(BOM付きになってしまう)。
↑変換前は、BOMなしUTF-8です。
↑変換後は、Shift_JISに変換されました。
文字コードを入れ替えるだけで、他のパターンでもコード変換が簡単に出来るようになります。