Как использовать оператор "-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=
, который, похоже, поддерживает этот вывод, поскольку он не дает вам никаких проблем. Если вы действительно хотите, чтобы это было добавлено, это может решить вашу проблему.