Set-Content はファイルの末尾に改行 (改行、CRLF) を追加します 質問する

Set-Content はファイルの末尾に改行 (改行、CRLF) を追加します 質問する

元の設定ファイル (web1.config) には余分な行がなく、メモ帳で表示すると (すべての文字を表示) 次のようになります。

ここに画像の説明を入力してください

 <?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6" />
  </system.web>
  <appSettings>
    <add key="myConnectionString" value="server=localhost;database=myDb;uid=myUser;password=myPass;" />
  </appSettings>
</configuration>

ここで、スクリプトを適用してデータベース名を次のような名前に変更する必要があります。

 Move-Item "web1.config" "webtemp.config"
Get-Content "webtemp.config" | ForEach-Object {$_ -replace "database=myDb;", "database=newDb;"} |Set-Content "web1.config" -Force
Remove-Item "webtemp.config"
Write-Output('Settings Changed')

したがって、生成される新しいファイル (web1.config) は次のようになります。

ここに画像の説明を入力してください

ファイルの最後に追加された余分な行に注意してください (これはまったく必要ありません)。次のような他のすべてのオプションを試しました。

  • out-fileAPIの使用
  • .NETメソッドを使用するSystem.IO.StreamWriter
  • フラグを使用-nonewline(10行すべてを1行に変換します)
  • 異なるエンコードオプションを使用する
  • 置き換え\r\nを試みました\r(set-content は常に crlf を生成するため、動作しません)

PowerShell v5.1を使用しています。

ベストアンサー1

要約PS5+ について; 古いバージョンについては下部を参照してください):

(Get-Content webtemp.config) -replace 'database=myDb;', 'database=newDb;' -join "`n" |
  Set-Content -NoNewline -Force web1.config

注: Unix スタイルの LF のみの行末ではなく、Windows スタイルの CRLF 行末が必要な場合は、"`n" に置き換えます (PowerShell および多くのユーティリティは両方を処理できます)。"`r`n"


PS5+ についてSet-Contentは、-NoNewlineスイッチ、 どれのSet-Content各入力オブジェクトの後に改行を追加しないように指示しますAdd-Contentおよびコマンドレットにも同様に適用されますOut-File

言い換えると:Set-Content -NoNewline 直接連結する文字列表現全て入力オブジェクト:

PS> 'one', 'two' | Set-Content -NoNewline tmp.txt; Get-Content tmp.txt
onetwo

渡す相手Set-Content -NoNewline単一の文字列それすでに改行が埋め込まれているそのまま使用して、目的の結果を得ることができます。

PS> "one`ntwo" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?"
one
two?

Get-Content -Rawファイルを読み込むことに注意してください全体として、そのまま?(文字のデコードは別として) が直後に現れるということは、twoファイルに末尾の改行がないことを意味します。

あなたの場合、入力行を処理しているので一つずつ(経由Get-Content それなし -Raw)を出力し、配列行(文字列)を複数行に分割する場合は、最初に改行で結合する必要があります。セパレーター-Set-Content -NoNewline行のみ - そして、上部に示すように、結果を に渡します。以下は簡略化された例です。

PS> ('one', 'two') -join "`n" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?"
one
two?

'one', 'two'行単位の処理コマンドの代わりとなる 2 要素の文字列配列です。

エンコードに関する注意:

Windows PowerShell では、Set-Contentシステムの従来のシングルバイト コード ページに基づいて、既定で "ANSI" でエンコードされたファイルが生成されます。
エンコードを明示的に制御するには、-Encodingパラメーターを使用します。


PSv4-.NET Framework を使用するソリューションが必要です。

PS> [System.IO.File]::WriteAllText('tmp.txt', ('one', 'two') -join "`n"); "$(Get-Content -Raw tmp.txt)?"
one
two?

ご了承ください[System.IO.File]::WriteAllText()エンコード引数がない場合、BOMなしのUTF-8がデフォルトになります
[System.Text.Encoding]必要に応じて、3 番目の引数としてエンコーディング インスタンスを指定します。

おすすめ記事