25

基本的に、いくつかのテキスト文字列で検索と置換を行うスクリプトがあります。最初のいくつかの文字列は機能しますが、アカウント キーを実行すると機能しません。この問題を解決するにはどうすればよいですか?

スクリプトは次のとおりです。

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"))
    }
4

3 に答える 3

7

V3 をお持ちの場合は、自動列挙、Get-Content の -Raw スイッチ、およびいくつかの改行継続構文を利用して、文字列 .replace() メソッドの代わりに文字列 .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() メソッドを使用すると、置換されるテキスト引数 (正規表現ではない) にリテラル文字列が使用されるため、置換するテキスト引数で正規表現のメタ文字をエスケープすることについて心配する必要はありません。

于 2013-11-05T17:44:06.460 に答える
5

あなたの例では、ソース文字列を先頭に追加しましAccountKey=たが、ターゲット文字列は先頭に追加しませんでした。

$c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='

ターゲット文字列にそれを含めないことにより、結果の文字列はAccountKey=それを置き換える代わりに削除されます。この例ではこれを正しく行っていAccountName=ますが、問題が発生していないため、この結論を支持しているようです。本当にそれを前に付けるつもりなら、これで問題が解決するかもしれません。

于 2013-11-05T16:46:46.123 に答える