2012-02-02 2 views
12

У меня есть следующий сценарий Powershell:без учета регистра замены PowerShell

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

Скрипт работает отлично до тех пор, как ключ реестра экзаменационного точно соответствует случаю, я указал - «браузер».

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

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

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

Благодаря Брэд

+1

Я думаю, что я понял, как это сделать - следующий, кажется, работает: $ RegExplorer = Get-ItemProperty -Path HKLM: \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Параметры $ NullSessionPipes = «$ ($ RegExplorer.NullSessionPipes)» $ NullSessionPipes $ NullSessionPipes = $ NullSessionPipes -ireplace ("БРАУЗЕР", "") $ NullSessionPipes – Brad

ответ

5

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

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

замена Regex имеет недостатки, когда результаты поиска или замены строки имеют регулярное выражение метасимволы в них ... – Bob

+1

В этот случай представляет собой статическую известную строку. Если строка поиска неизвестна (переменная), вы можете автоматически ее избежать с помощью '[regex] :: escape ($ search_string)' –

10

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

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

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

+0

. У замены Regex есть недостатки, когда ваши строки поиска или замены имеют метасимволы регулярных выражений в них ... – Bob

9

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

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

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

к этому:

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

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

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

Сохранено я много времени. Ищет иглу в стоге сена, и это решило это Thx человек, очень ценю это! – DarkLite1

+0

Вы можете использовать '$ NullSessionPipes = $ NullSessionPipes -ireplace 'browser'," "' - одиночные кавычки деактивировать регулярные выражения – Marc

+0

Я боюсь, что одинарная кавычка не деактивирует регулярное выражение, доказательство: 'asdf.qwer' -ireplace '.', "X" – Ivan

3

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

метод string.replace

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

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 
Смежные вопросы