PowerShellで、色々な方法でテキスト出力して、結果を比較してみました。
出力方法によって、文字コード(BOMの有無)や改行コードなどの仕様が微妙に異なるようです。
試してみた
@ECHO OFF
SET PARENT=%~dp0
SET SCRIPT=%PARENT%writetest.ps1
SET ARGS=
TYPE %SCRIPT% | powershell -command "Invoke-Expression('&{' + $input + '} %ARGS%')"
> $text = "1行目`n2行目`n";
>
> $text > 1_Redirect.txt;
> $text | Out-File '2_Out-File.txt';
> [IO.File]::WriteAllLines('3_WriteAllLines.txt',$text);
> [IO.File]::WriteAllText('4_WriteAllText.txt',$text);
↑先頭が[だとQiitaでうまく表示されないみたいなので、先頭に>をつけて回避(実行時は不要)
writetest.bat
結果
以下、画面ショット(テキストでは分かりにくいので)
1_Redirect.txt
文字コード:UTF-8(BOM付)
末尾の改行コード(CRLF):あり
2_Out-File.txt
文字コード:UTF-8(BOM付)
末尾の改行コード(CRLF):あり
3_WriteAllLines.txt
文字コード:UTF-8(BOMなし)
末尾の改行コード(CRLF):あり
4_WriteAllText.txt
文字コード:UTF-8(BOMなし)
末尾の改行コード(CRLF):なし
まとめ
Linux用のShellファイルを生成するならば、末尾に改行コード(CRLF)が出力されないWriteAllTextでテキスト出力するべきだ、ということが分かりました。
筆者ははじめ、WriteAllLinesでShellファイルを生成しようとしていましたが、末尾に改行コード(CRLF)が出力されて、しばらく原因が分からずハマりました。(後で気づいたのですが、「C#ポケットリファレンス」(書籍)に、WriteAllLinesでは改行コードが付くことが明記されていました。きちんと読まないとだめですね・・・)