3

以下の単純なファイル置換を想定します。

get-content db.cfg | %{$_ -replace 'a', 'b'} | out-file db.cfg.new -encoding default

out-fileは自動的に\r\nを行区切り文字として使用します。別のセパレーター(\ nなど)を強制する方法はありますか?

私はエレガントな解決策を探しています。それ以外は、確かにファイル全体を文字列としてメモリに作成し、それを書き出すことができます。

4

3 に答える 3

3

次のように、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行ずつファイルをストリーミングしています。

于 2012-04-18T18:26:27.047 に答える
0

作成後の変換はどうですか?

$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)
于 2012-04-04T03:44:39.080 に答える
0

パイプラインの最後でout-fileを使用する場合、行区切り文字を制御できないようです。

ただし、もちろん、ファイルをメモリ内の文字列として作成したり、ファイルを保存した後に行末を変換したりすることもできます。

PowerShellの代わりにSwissFileKnifeを使用して置換を実行することでユースケースを解決しました。このような基本的な問題の回避策を実装するのは正しくないと感じました。

于 2012-04-18T17:59:31.943 に答える