PowerShellの文字コード

DLNAで共有するビデオコンテンツをすべてMPEG2-TSに変換しようとTSMUXERを使ってバッチを作成していました。

変数へ実行結果を代入するにはFor文を使ってできるのですが、MediaInfoのCLIではどうも安定してうまくいかず、PowerShellで作成することにしました。

変換用のスクリプトを作成時、はまったのが文字コードです。

変換手順
1.MediaInfoで情報を取得
2.mp4boxで映像と音声を分離
3.取得した情報をもとにTSmuxer用メタファイルを作成
4.TSmuxerを実行

4番で「Invalid codec Format」のエラーが発生してしまい変換ができませんでした。
調査したところ、原因はTSmuxer用メタファイルの文字コードでした。
文字コードが原因であるということにたどり着くまでMeGUIで同じことをしてLogに出力されるコマンドやメタファイルを見比べたり・・・
□□Mって表示がどこからのものなのかがわからなくてはまりました。

PowerShellの文字コードはUnicode(UTF16)です。
作成したスクリプトも当然Unicodeですし、表示した文字列をファイルにリダイレクトするとUnicodeで保存されます。

Windowsの内部の文字コードはUnicodeなのでPowerShellもUnicodeなのは仕方がないことです。

以下の画像はメタファイルをUnicode、SJIS、UTF-8で作成した場合の結果です。

Unicode(文字コード指定なし)
Invalid codec Formatのエラーが発生(MUXOPTの前にゴミがつく)
powershell_20110720_unicode

UTF-8
Invalid codec Formatのエラーが発生(MUXOPTの前にゴミがつく)
powershell_20110720_utf8

SJIS
エラーなく実行される
powershell_20110720_sjis

出力したファイルをさくらエディタで文字コードを変換すると、Unicode⇒UTF8の場合は半角文字が全角文字?になってしまうためエラーになりました。
また、スクリプト自体をUTF8で作成すると日本語文字などが文字化けし、文法的にもおかしくなる箇所があり正常に動作しませんでした。
結局、スクリプト自体はUnicodeのまま、メタファイル作成箇所をOUT-FileでSJISに変換しファイルに保存するように修正しました。

根本的な原因はPowerShellとTSmuxerの文字コードの対応状況ということになります。
TSmuxer自体は、UnicodeはNG、SJISとUTF8はOKでした。

この程度のスクリプトを記述するのに4時間以上かかってしまいました。
変換処理は151タイトルで3時間くらいかかりそうです。

PowerShellに慣れてもう少し手際よくきれいなスクリプトがかければ、動画関連のスクリプトはすべてPowerShellにしようと思います。

先日導入したUNIXベースアプリケーション用サブシステムは、そもそもUNIX資産をもっていないのであまり使うことはなさそうです。
コマンドプロンプトでlsやらが使えるようになったのは、ちょっとありがたいかも・・・