Как использовать оператор "-replace" в PowerShell, чтобы заменить строки текстов специальными символами и успешно заменить

У меня есть сценарий, где я в основном делаю поиск и замену на несколько строк текста. Первые две строки работают, но когда я делаю ключи учетной записи, они этого не делают. Как я могу исправить эту проблему?

Вот сценарий:

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

Ответ 1

"-replace" выполняет поиск по регулярному выражению, и у вас есть специальные символы в последнем (например, +). Таким образом, вы можете использовать версию замены без регулярного выражения следующим образом:

$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')

Ответ 2

Если у вас есть V3, вы можете использовать автоматическое перечисление, переключатель -Raw в Get-Content и некоторый новый синтаксис консинуляции строк, просто используя это с использованием метода.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() использует литеральные строки для замененного текстового аргумента (не регулярного выражения), поэтому вам не нужно беспокоиться об экранировании метасимволов регулярного выражения в аргументе text-to -replace.

Ответ 3

В вашем примере вы добавили исходную строку в AccountKey= но не в свою целевую строку.

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

Не считая этого в целевой строке, результирующая строка удалит AccountKey= вместо ее замены. Вы правильно это сделаете с помощью AccountName=, который, похоже, поддерживает этот вывод, поскольку он не дает вам никаких проблем. Если вы действительно хотите, чтобы это было добавлено, это может решить вашу проблему.