以下の単純なファイル置換を想定します。
get-content db.cfg | %{$_ -replace 'a', 'b'} | out-file db.cfg.new -encoding default
out-fileは自動的に\r\nを行区切り文字として使用します。別のセパレーター(\ nなど)を強制する方法はありますか?
私はエレガントな解決策を探しています。それ以外は、確かにファイル全体を文字列としてメモリに作成し、それを書き出すことができます。
以下の単純なファイル置換を想定します。
get-content db.cfg | %{$_ -replace 'a', 'b'} | out-file db.cfg.new -encoding default
out-fileは自動的に\r\nを行区切り文字として使用します。別のセパレーター(\ nなど)を強制する方法はありますか?
私はエレガントな解決策を探しています。それ以外は、確かにファイル全体を文字列としてメモリに作成し、それを書き出すことができます。
次のように、Out-Fileコマンドレットの代わりにStreamWriterを使用できます。
$writer = [system.io.file]::CreateText("\path\to\db.cfg.new")
$writer.NewLine = "`n"
get-content db.cfg | %{$_ -replace 'a', 'b'} | % { $writer.WriteLine($_)}
$writer.Close()
ワンライナーほど滑らかではありませんが、少なくとも読みやすく、一度に1行ずつファイルをストリーミングしています。
作成後の変換はどうですか?
$fileToConvert = "db.cfg.new"
$filName = "db.cfg"
$text = ([IO.File]::ReadAllText($fileToConvert) -replace "`r`n?", "`n")
$encoding = New-Object System.Text.ASCIIEncoding
[IO.File]::WriteAllText("$filename", $text, $encoding)
パイプラインの最後でout-fileを使用する場合、行区切り文字を制御できないようです。
ただし、もちろん、ファイルをメモリ内の文字列として作成したり、ファイルを保存した後に行末を変換したりすることもできます。
PowerShellの代わりにSwissFileKnifeを使用して置換を実行することで、ユースケースを解決しました。このような基本的な問題の回避策を実装するのは正しくないと感じました。