Нечувствительная к регистру замена 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