misc.log

日常茶飯事とお仕事と

PowerShellでテキストファイルの改行コードLFをCRLFに変更する

仕事で、改行コードにLFが使われたShift-JISテキストファイルの改行コードを、全てCR+LFに置き換える処理をササッと作る必要が出てきました。それも処理を記述するのは「バッチファイルの中」ww。やり方はいろいろあるとおもいますが、なるべく変更作業を大きくしたくなかったので、PowerShellの「Get-Content」が、ファイル読み込み時に改行コードLFであっても改行として読み込むことと、「Set-Content」が出力ファイルの改行コードをCRLFにすることを利用して、「Get→Set」でファイルを読み書きする過程で改行コード変換をさせることにしました。

バッチファイルからPowerShellのコマンドを呼ぶ方法も色々あると思いますが、なるべく行数を減らしたかったのでこれで行きました。下記は改行を入れていますが、1行に続けて書けます。

powershell -NoProfile -ExecutionPolicy Unrestricted 
-Command "& {Get-Content %FILENAME% | Set-Content -Encoding oem %FILENAME%TMP; 
Remove-Item %FILENAME%; 
Rename-Item %FILENAME%TMP %FILENAME%}"

Set-Contentの引数に「-Encoding oem」を付けているのは、PowerShellのコマンドが無指定だとUTF-8(BOM付き)のファイルを出してしまうからです。この引数を付けることで、出力ファイルの文字コードを「動作プラットフォームの標準文字コード(日本語版WindowsであればShift-JIS)」で出力されます。

末尾のRemoveとRenameは、出力ファイルを元のファイル名に戻すためです(元のファイルを消し、テンポラリーとして作ったファイルを元のファイル名にリネームする)。