Нечувствительная к регистру замена PowerShell

У меня есть следующий скрипт PowerShell:

$RegExplorer = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)"
$NullSessionPipes
$NullSessionPipes =  $NullSessionPipes.replace("browser", "")
$NullSessionPipes

Сценарий работает нормально, если проверяемый ключ реестра точно соответствует указанному мной случаю - "браузер".

Однако если в ключе реестра указано "БРАУЗЕР" или "Браузер", дело не в замене.

Я ищу способ сделать string.replace без учета регистра. Я знаю, что мог бы сначала преобразовать строку, используя .tolower или .toupper, чтобы упростить сравнение, но я не знаю, чувствителен ли этот конкретный ключ реестра или приложения, которые обращаются к нему, с учетом регистра, поэтому я не хочу менять регистр существующий ключ.

Есть простой способ сделать это?

Ответ 1

Назовите меня педантичным, но, хотя здесь никто не ошибся, никто не предоставил правильный код для окончательного решения.

Вам нужно изменить эту строку:

$NullSessionPipes =  $NullSessionPipes.replace("browser", "")

на это:

$NullSessionPipes =  $NullSessionPipes -ireplace [regex]::Escape("browser"), ""

Странный текст [regex] не является строго необходимым, если в вашей строке нет символов регулярного выражения (например, * + []() и т.д.). Но с этим вам безопаснее. Этот синтаксис работает и с переменными:

$NullSessionPipes =  $NullSessionPipes -ireplace [regex]::Escape($stringToReplace), $stringToReplaceItWith

Ответ 2

NullSessionPipes - это многострочное значение, и метод replace (помимо чувствительности к регистру) может завершиться неудачей, если в нем больше одной строки. Вы можете использовать оператор -replace. По умолчанию все операторы сравнения нечувствительны к регистру. Операторы, чувствительные к регистру, начинаются с "c", например: -creplace, -ceq и т.д.

Операторы, начинающиеся с "i", не чувствительны к регистру, например, -ireplace, -ieq, и они являются такими же, как -replace, -ieq.

Дополнительную информацию см. в разделе about_Comparison_Operators.

Ответ 3

Вместо этого замените регулярное выражение:

$RegExplorer =  Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)"
$NullSessionPipes  
$NullSessionPipes = $NullSessionPipes -replace "browser", ""
$NullSessionPipes 

Ответ 4

В методе .Replace отсутствует опция без учета регистра:

Метод String.Replace

... Этот метод выполняет порядковый (чувствительный к регистру и нечувствительный к культуре) поиск...

https://msdn.microsoft.com/en-us/library/fk49wtc1(v=vs.110).aspx

Другие ответы на этот вопрос предполагают использование -replace или -ireplace, что отлично, если вы хотите использовать замену регулярных выражений. Однако, как @Bob упоминает в своих (ее?) Комментариях, это не всегда уместно. Например, если вы хотите включить в текст замены литеральную строку, такую ​​как $_.

Один трюк, заимствованный из других регистрозависимых мест, - это преобразование строки ввода и строки поиска в нижний регистр:

[PS]> "TeXT".ToLower().Replace("text","NewString")
NewString

Однако... это приводит к тому, что вывод будет в нижнем регистре для всего, что не соответствует строке поиска, что вполне может быть неприемлемым.

[PS]> "DON'T CHANGE MY TeXT".ToLower().Replace("text","NewString")
don't change my NewString

Ответ 5

(get-content c:\testConvert.txt) | foreach-object {$_ -creplace[regex]::Escape("something"), "another thing"} | set-content c:\testConvert.txt