不区分大小写的PowerShell替代品

时间:2012-02-02 18:13:29

标签: powershell replace case

我有以下PowerShell脚本:

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

只要注册表项检查与我指定的情况完全匹配 - “浏览器”,脚本就可以正常工作。

但是,如果注册表项中的情况不同,则说“浏览器”或“浏览器”不会进行替换。

我正在寻找一些方法来使string.replace不区分大小写。我知道我可以首先使用.tolower或.toupper转换字符串以使比较更容易,但我不知道这个特定的注册表项或访问它的应用程序是否区分大小写,所以我不想更改现有的关键。

有一种简单的方法吗?

4 个答案:

答案 0 :(得分:23)

叫我迂腐,虽然这里没有人是彻头彻尾的错,但没有人为最终解决方案提供正确的代码。

您需要更改此行:

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

到此:

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

只要字符串中没有正则表达式字符(例如* + []()等),就不一定需要奇怪的[正则表达式]文本。但你用它更安全。此语法也适用于变量:

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

答案 1 :(得分:10)

NullSessionPipes是一个多字符串值,如果其中包含多个字符串,则替换方法(除了区分大小写)可能会失败。您可以使用-replace运算符。默认情况下,所有比较运算符都不区分大小写。区分大小写的运算符以'c'开头,如:-creplace,-ceq等。

以'i'开头的运算符不区分大小写,例如-ireplace,-ieq,它们与-replace,-ieq相同。

有关详细信息,请参阅about_Comparison_Operators。

答案 2 :(得分:6)

使用正则表达式替换:

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

答案 3 :(得分: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