管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

Powershellで複数ファイルの中身を一括置換

Powershellで複数ファイルの中身を一括置換する方法をメモ。
昨日のsedのPowershell版です。

確認環境

# 検証環境
PS C:\Users\hoge\Desktop\replace_test> $PSVersionTable.PSVersion                                                        
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      18362  1110

複数ファイルの中身を一括置換

処理対象ファイル

# Get-ChldItem結果をforeachで処理することで
# find->xargs->headのような処理結果とすることができました
PS C:\Users\hoge\Desktop\replace_test>  Get-ChildItem . |`
 %{$_.name; echo ======; cat $_.Name; echo ""}

one.txt
======
first
second
third

three.txt
======
first
second
third

two.txt
======
first
second
third

処理実行

# 直接ファイルにリダイレクトせず、いったん変換結果を変数に格納して、それをリダイレクトするのがポイントのようです
# 直接ファイルにリダイレクトしたら、エラーこそ出ませんでしたがファイルの中身が空っぽになってしまいました
PS C:\Users\hoge\Desktop\replace_test> Get-ChildItem . |`
 %{ $replaced = $(Get-Content $_.Name) -replace "first","FIRST"; $replaced > $_.Name }

PS C:\Users\hoge\Desktop\replace_test>  Get-ChildItem . |`
%{$_.name; echo ======; cat $_.Name; echo ""}

one.txt
======
FIRST
second
third

three.txt
======
FIRST
second
third

two.txt
======
FIRST
second
third

参考にしました