元の設定ファイル (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-file
APIの使用- .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 番目の引数としてエンコーディング インスタンスを指定します。