Замена PowerShell без учета регистра - PullRequest
19 голосов
/ 02 февраля 2012

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

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

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

Однако, если в разделе реестра указано «BROWSER» или «Browser», регистр не будет заменен.

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

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

Ответы [ 4 ]

24 голосов
/ 08 марта 2016

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

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

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

на эту:

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

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

$NullSessionPipes =  $NullSessionPipes -ireplace [regex]::Escape($stringToReplace), $stringToReplaceItWith
10 голосов
/ 03 февраля 2012

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

Операторы, начинающиеся с 'i', не чувствительны к регистру, как -ireplace, -ieq, и они одинаковы.как -relace, -ieq.

См. About_Comparison_Operators для получения дополнительной информации.

6 голосов
/ 02 февраля 2012

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

$RegExplorer =  Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)"
$NullSessionPipes  
$NullSessionPipes = $NullSessionPipes -replace "browser", ""
$NullSessionPipes 
4 голосов
/ 28 ноября 2016

В методе .Replace отсутствует регистр - в чувствительной опции:

Метод String.Replace

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

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

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

Один прием, заимствованный из других чувствительных к регистру мест, заключается в преобразовании строки «input» и строки «search» в нижний регистр:

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

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

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