基本的に、いくつかのテキスト文字列の検索と置換を行うスクリプトがあります。最初のいくつかの文字列は機能しますが、アカウントキーを実行すると機能しません。この問題を修正するにはどうすればよいですか?
スクリプトは次のとおりです。
Get-ChildItem "[FILEPATH]" -recurse |
Foreach-Object {
$c = ($_ | Get-Content)
$c = $c -replace 'abt7d9epp4','w2svuzf54f'
$c = $c -replace 'AccountName=adtestnego','AccountName=zadtestnego'
$c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='
[IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}
'-replace'は正規表現検索を行い、その最後の文字に特殊文字(+など)があるため、次のような非正規表現置換バージョンを使用できます。
$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')
V3をお持ちの場合は、自動列挙、Get-Contentの-Rawスイッチ、およびこれに単純な新しい行連結構文を利用して、代わりにstring .replace()メソッドを使用できます。 -置換演算子:
(Get-ChildItem "[FILEPATH]" -recurse).FullName |
Foreach-Object {
(Get-Content $_ -Raw).
Replace('abt7d9epp4','w2svuzf54f').
Replace('AccountName=adtestnego','AccountName=zadtestnego').
Replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==') |
Set-Content $_
}
.replace()メソッドを使用すると、置換されたテキスト引数(正規表現ではない)にリテラル文字列が使用されるため、text-to-replace引数で正規表現のメタ文字をエスケープすることを心配する必要はありません。
この例では、ソース文字列の先頭にAccountKey=
を追加していますが、ターゲット文字列は追加していません。
$c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='
これをターゲット文字列に含めないことにより、結果の文字列はAccountKey=
を置き換える代わりに削除します。 AccountName=
の例を使用してこれを正しく行います。これは問題を引き起こさないため、この結論をサポートしているようです。本当にそれを追加するつもりなら、これはあなたの問題を解決するかもしれません。