2012-02-02 13 views
12

Ho il seguente script PowerShell:Case-insensitive sostituzione PowerShell

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

Lo script funziona bene fino a quando la chiave di registro esaminando esattamente partite caso ho specificato - "browser".

Tuttavia se il caso era diverso nella chiave di registro dire "BROWSER" o "Browser" non esegue la sostituzione.

Sto cercando un modo per rendere string.replace case insensitive. So che potrei convertire la stringa usando .tolower o .toupper per rendere il confronto più semplice, ma non so se questa particolare chiave di registro o le applicazioni che accedono ad esso siano case sensitive, quindi non voglio cambiare il caso della chiave esistente .

C'è un modo semplice per farlo?

Grazie Brad

+1

credo di aver capito come fare questo - il seguente sembra funzionare: $ RegExplorer = Get-ItemProperty -Path HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ parametri $ NullSessionPipes = "$ ($ RegExplorer.NullSessionPipes)" $ NullSessionPipes $ NullSessionPipes = $ NullSessionPipes -ireplace ("browser", "") $ NullSessionPipes – Brad

risposta

5

Utilizzare una sostituzione espressione regolare invece:

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

Regex sostituzione ha svantaggi quando i vostri ricerca o sostituzione stringhe hanno metacaratteri regex in loro ... – Bob

+1

in questo caso è una stringa nota statica. Se la stringa di ricerca è sconosciuta (una variabile) puoi eseguire l'escape automatico usando '[regex] :: escape ($ search_string)' –

10

NullSessionPipes è un valore multistringa e il metodo replace (oltre ad essere-sensitive) può riuscire se c'è più di una stringa in esso. È possibile utilizzare l'operatore -place. Per impostazione predefinita, tutti gli operatori di confronto non fanno distinzione tra maiuscole e minuscole. Gli operatori con distinzione tra maiuscole e minuscole iniziano con "c", come: -creplace, -ceq, ecc.

Gli operatori che iniziano con "i" non fanno distinzione tra maiuscole e minuscole, come -ireplace, -ieq e sono gli stessi di - sostituire, -ieq.

Vedere about_Comparison_Operators per ulteriori informazioni.

+0

La sostituzione di Regex ha degli svantaggi quando le tue stringhe di ricerca o di sostituzione hanno espressioni regolari metacaratteri in esse ... – Bob

9

Chiamami pedante ma mentre nessuno qui era completamente sbagliato, nessuno ha fornito il codice corretto per la soluzione finale.

è necessario modificare questa riga:

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

a questo:

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

La strana [regex] testo non è strettamente necessario a patto che non ci sono personaggi espressioni regolari (ex . * + [](), etc) nella stringa. Ma tu sei più al sicuro con esso. Questa sintassi funziona con le variabili troppo:

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

Salvato io un sacco di tempo. Cercavo un ago in un pagliaio e questo l'ha risolto, lo apprezzo davvero! – DarkLite1

+0

Puoi usare '$ NullSessionPipes = $ NullSessionPipes -ireplace 'browser'," "' - le virgolette singole disattivano le espressioni regolari – Marc

+0

Ho paura che la virgoletta singola non disattivi l'espressione regolare, prova: 'asdf.qwer' -ireplace '.', "X" – Ivan

3

Il metodo .Replace non hai caso- in opzione sensibili:

metodo String.Replace

... Questo metodo esegue un ordinale (con distinzione tra maiuscole e minuscole e non sensibile alla cultura) ricerca in corso ...

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

Le altre risposte a questa domanda suggeriscono usando -replace o -ireplace, che va bene se si desidera utilizzare la sostituzione regex. Tuttavia, come @Bob cita nei suoi commenti (suo?) Questo non è sempre appropriato. Un esempio potrebbe essere se si desidera includere una stringa letterale come $ _ nel testo sostitutivo.

Un trucco preso in prestito da altri luoghi maiuscole e minuscole è quello di convertire la stringa "input" e la stringa "cerca" in minuscolo:

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

Tuttavia ... In questo modo l'uscita di essere in minuscolo per tutto ciò che non corrisponde alla stringa di ricerca, che potrebbe essere inaccettabile.

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