これはforeachで処理するために必要であり納得もできる仕様だが、うっかりすると罠になるという挙動。
ファイルをGet-Contentで読み、読み込んだ変数をPowerShellで表示させると正しく改行されているように見える。
しかしそれは配列の各要素が改行で区切られて表示されているだけで、変数には改行コード入り文字列が入っているわけではない。1行分文字列の配列が入っている。
変数を他の文字列と文字列結合したりC#のメソッドに渡すと、改行されているように見える場所は空白(アスキーコード32)に変化する。
$str = Get-Content .\info.dat
echo $str # 正しく改行されているように見える
{
"data": "hoge"
}
echo ("" + $str) # ●空文字と結合すると改行が空白に化ける!
{ "data": "hoge" }
$str Set-Content .\out.txt # 書き出されたファイルは、CR+LFで改行が入る
[System.IO.File]::WriteAllText("test.txt", $str) # ●書き出されたファイルは、改行が空白に化ける!
[System.Text.Encoding]::UTF8.GetBytes($str)[1] # 2バイト目を取り出してみると、空白(アスキーコード32)ということになっている
32