Любой блок скриптов в Powershell может создавать значения. Это делается с помощью , а не сохранения значения в переменной:
{ $foo = 3 }
ничего не производит
{ 3 }
производит целое число 3
.
Точно так же
ForEach-Object { $_ = "something" }
ничего не производит
ForEach-Object { $_ = "something"; $_ }
производит строку "something"
Ваше тело цикла ничего не выводит, это похоже на верхний пример выше. Поэтому Set-Content
не имеет ничего общего. Измените блок, чтобы фактически вернуть измененное значение $_
:
$replacements = @(
@{regex='using (System|Potentially|Others);'; replacement='using Microsoft.$1;' }
@{regex='optionsBuilder\.UseSqlServer\("[^"]*"\)'; replacement='optionsBuilder.UseSqlServer("Database")' }
# more search/replace pairs
)
Get-Content .\APSContext.cs -Encoding UTF8 | ForEach-Object {
foreach ($item in $replacements) {
$_ = $_ -replace $item.regex, $item.replacement
}
$_ # <--- this is what produces the line
} | Set-Content -Path .\test.cs -Encoding UTF8
При этом никогда не загружайте и не сохраняйте текстовые файлы без указания их кодировки. Для файлов исходного кода C # я думаю, что по умолчанию используется UTF-8.
И , что, как говорится, 1033 *, изменение исходного кода с помощью регулярных выражений не очень хорошая вещь. Если это разовое, хорошо. Если вы планируете делать это регулярно, вы делаете что-то не так. Работайте с файлами конфигурации или переменными среды, вместо того чтобы хранить в своем коде буквальные значения, которые могут регулярно изменяться.