5
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShellで、色々な方法でテキスト出力して、結果を比較してみた

Last updated at Posted at 2015-11-08

PowerShellで、色々な方法でテキスト出力して、結果を比較してみました。
出力方法によって、文字コード(BOMの有無)や改行コードなどの仕様が微妙に異なるようです。

試してみた

writetest.bat
@ECHO OFF
SET PARENT=%~dp0
SET SCRIPT=%PARENT%writetest.ps1
SET ARGS=

TYPE %SCRIPT% | powershell -command "Invoke-Expression('&{' + $input + '} %ARGS%')"
writetest.ps1
> $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
image.png
文字コード:UTF-8(BOM付)
末尾の改行コード(CRLF):あり

2_Out-File.txt
image.png
文字コード:UTF-8(BOM付)
末尾の改行コード(CRLF):あり

3_WriteAllLines.txt
image.png
文字コード:UTF-8(BOMなし)
末尾の改行コード(CRLF):あり

4_WriteAllText.txt
image.png
文字コード:UTF-8(BOMなし)
末尾の改行コード(CRLF):なし

まとめ

Linux用のShellファイルを生成するならば、末尾に改行コード(CRLF)が出力されないWriteAllTextでテキスト出力するべきだ、ということが分かりました。

筆者ははじめ、WriteAllLinesでShellファイルを生成しようとしていましたが、末尾に改行コード(CRLF)が出力されて、しばらく原因が分からずハマりました。(後で気づいたのですが、「C#ポケットリファレンス」(書籍)に、WriteAllLinesでは改行コードが付くことが明記されていました。きちんと読まないとだめですね・・・)

5
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?