Powershell -замена не заменяет содержимое

#windows #powershell

Вопрос:

Я пытаюсь заменить строку в текстовом файле. Вот мой текстовый файл и Powershell скрипт

Текстовый файл

 String^ m5 = ss.FileMD5(a, salt);
    if (m5 != "e11621cc4370a5203423cc1d1ee8c2a7") {
        return 6;       //mismatch
    }
 

Сценарий Powershell

 $fl = "G:tmptesttest.txt"
$find = "m5 !="
$repl = 'if (m5 != "aaaaaaaa") {'
$content = (Get-Content $fl)

$line = $content | Select-String $find | Select-Object -ExpandProperty Line
if ($line -eq $null) {
  "Match Not Found"
  exit
} else {
  $content = $content | ForEach-Object { $_ -replace $line, $repl }
  $content  # print replaced content
}
 

Это всегда печать старого контента без замены.

Что плохого я делаю в этом сценарии ?

Ответ №1:

При попытке заменить переменная $line if (m5 != "e11621cc4370a5203423cc1d1ee8c2a7") { содержит специальные символы регулярного выражения, которые необходимо экранировать.

Изменить

 $content = $content | ForEach-Object { $_ -replace $line, $repl }
 

Для

 $content = $content | ForEach-Object { $_ -replace [regex]::Escape($line), $repl }
 

Комментарии:

1. В качестве альтернативы вы можете использовать $content = ($content).replace($line,$repl) , который рассматривает его как обычный текст, а не регулярное выражение. String.replace() является методом, в котором -replace используется оператор

2. @Дрю ($content).replace($line,$repl) тоже работает нормально. Я буду помнить это.