2012-02-02 7 views
12

Tengo el siguiente script de PowerShell:Caso insensible a la sustitución PowerShell

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

El script funciona bien siempre y cuando la clave de registro examinar iguala exactamente el caso he especificado - "navegador".

Sin embargo, si el caso era diferente en la clave de registro decir "NAVEGADOR" o "Navegador" no hace el reemplazo.

Estoy buscando una forma de hacer que string.replace distinga entre mayúsculas y minúsculas. Sé que podría convertir la cadena usando .tolower o .toupper primero para facilitar la comparación, pero no sé si esta clave de registro en particular o las aplicaciones que acceden a ella distinguen entre mayúsculas y minúsculas, por lo que no quiero cambiar el caso de la clave existente .

¿Hay alguna manera fácil de hacerlo?

Gracias Brad

+1

creo que me di cuenta de cómo hacer esto - la siguiente parece funcionar: $ RegExplorer = Get-ItemProperty -path HKLM: \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ parámetros $ NullSessionPipes = "$ ($ RegExplorer.NullSessionPipes)" $ NullSessionPipes $ = $ NullSessionPipes NullSessionPipes -ireplace ("browser", "") $ NullSessionPipes – Brad

Respuesta

5

Utilice un reemplazo regular la expresión lugar:

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

reemplazo de expresiones regulares tiene inconvenientes cuando la búsqueda o la sustitución de cadenas tienen metacaracteres de expresiones regulares en ellos ... en – Bob

+1

este caso es una cadena conocida estática. Si la cadena de búsqueda es desconocida (una variable) puede escaparse automáticamente usando '[regex] :: escape ($ search_string)' –

10

NullSessionPipes es un valor de cadena múltiple y el método replace (además de ser entre mayúsculas y minúsculas) puede fallar si hay más de una cuerda en ella. Puede usar el operador -replace. Por defecto, todos los operadores de comparación no distinguen entre mayúsculas y minúsculas. Los operadores sensibles a las mayúsculas y minúsculas comienzan con 'c', como: -creplace, -ceq, etc.

Los operadores que comienzan con 'i' no distinguen entre mayúsculas y minúsculas, como -ireplace, -ieq, y son lo mismo que - reemplazar, -ieq.

Consulte about_Comparison_Operators para obtener más información.

+0

El reemplazo de Regex tiene inconvenientes cuando las cadenas de búsqueda o reemplazo tienen metacaracteres regex en ellas ... – Bob

9

Llámame pedante, pero si bien nadie estaba completamente equivocado, nadie proporcionó el código correcto para la solución final tampoco.

Es necesario cambiar esta línea:

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

a esto:

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

La extraña [expresiones regulares] texto no es estrictamente necesario, siempre y cuando no hay caracteres de expresiones regulares (por ejemplo, . * + [](), etc.) en su cadena. Pero estás más seguro con eso. Esta sintaxis funciona con variables también:

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

Guardado yo un montón de tiempo Estaba buscando una aguja en un pajar y esto lo resolvió. ¡Hombre, realmente lo aprecio! – DarkLite1

+0

Puede usar '$ NullSessionPipes = $ NullSessionPipes -ireplace 'browser'," "' - las comillas simples desactivan las expresiones regulares – Marc

+0

Me temo que las comillas simples no desactivan la expresión regular, prueba: 'asdf.qwer' -ireplace '.', "X" – Ivan

3

El método .Replace no tiene un caso- en opción sensible:

método String.Replace

... Este method realiza un ordinal (sensible a mayúsculas y minúsculas e insensible a la cultura) búsqueda ...

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

Las otras respuestas a esta pregunta sugieren el uso de -replace o -ireplace, que está bien si desea utilizar la sustitución de expresiones regulares. Sin embargo, como @Bob menciona en sus comentarios, esto no siempre es apropiado. Un ejemplo podría ser si desea incluir una cadena literal como $ _ en el texto de reemplazo.

Un truco tomado de otros lugares de mayúsculas y minúsculas es convertir la cadena "entrada" y la cadena "buscar" a minúsculas:

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

... Sin embargo esto hace que la salida sea en minúsculas para cualquier cosa que no coincida con la cadena de búsqueda, lo que puede ser inaceptable.

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