不区分大小写的PowerShell替换

35
我有以下的PowerShell脚本:
$RegExplorer = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)"
$NullSessionPipes
$NullSessionPipes =  $NullSessionPipes.replace("browser", "")
$NullSessionPipes

只要检查的注册表键与我指定的大小写-"browser"完全匹配,脚本就能正常工作。

但是,如果注册表键的大小写不同,比如"BROWSER"或"Browser",它就无法进行替换。

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

有没有简单的方法来解决这个问题?


1
我想我找到了如何做到这一点 - 以下似乎有效:$RegExplorer = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters $NullSessionPipes = "$($RegExplorer.NullSessionPipes)" $NullSessionPipes $NullSessionPipes = $NullSessionPipes -ireplace ("BROWSER", "") $NullSessionPipes - Brad
5个回答

52

不要误解我,虽然这里没有人完全错误,但也没有人提供最终解决方案的正确代码。

你需要修改这行代码:

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

到这个:

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

只要字符串中没有正则表达式字符(例如* + []()等),奇怪的[regex]文本就不是严格必需的。 但使用它更安全。 这种语法也适用于变量:

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

1
节省了我很多时间。一直在海量数据中寻找一个细微之处,而这个解决方案帮了我。谢谢你,非常感激! - DarkLite1
你可以使用 $NullSessionPipes = $NullSessionPipes -ireplace 'browser', "" - 单引号可以禁用正则表达式。 - Marc
1
很抱歉,单引号不能取消正则表达式,证明:'asdf.qwer' -ireplace '.', "X" - Ivan
@Ivan 你是对的!我刚刚回滚了 Marc 对我的原始答案进行的更改,现在它可以工作了。 - Ryan Shillington
我认为您需要在替换文本中将 $ 加倍,因为这是替换表达式语言的一部分: $NullSessionPipes = $NullSessionPipes -ireplace [regex]::Escape($stringToReplace), $stringToReplaceItWith.Replace('$','$$') - Steve B

13

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

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

有关更多信息,请参阅about_Comparison_Operators。


当您的搜索或替换字符串中包含正则表达式元字符时,使用正则表达式替换可能会有缺点。 - Bob

6

使用正则表达式替换:

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

1
当您的搜索或替换字符串中包含正则表达式元字符时,正则表达式替换具有缺点... - Bob
2
在这种情况下,它是一个已知的静态字符串。如果搜索字符串未知(变量),您可以使用 [regex]::escape($search_string) 进行自动转义。 - Andy Arismendi

5
.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

3
字符串的Replace方法有两个不同的重载,允许进行不区分大小写的替换: Replace(String, String, StringComparison) Replace(String, String, Boolean, CultureInfo) 对于第一个方法,您需要选择一个忽略大小写的StringComparison,例如OrdinalIgnoreCase。 对于第二个方法,是Boolean控制大小写敏感性;CultureInfo的空值使用当前文化。
在PowerShell 7中使用这些方法的示例代码如下:
$s = 'All the HIP cats'
$s.Replace('hip','cool')                     # doesn't work: All the HIP cats
$s.Replace('hip','cool','OrdinalIgnoreCase') # works       : All the cool cats
$s.Replace('hip','cool',$true,$null)         # works       : All the cool cats

在Powershell中如何编写$s.Replace('hip','cool','OrdinalIgnoreCase')?在Powershell中调用静态C#方法很简单,但这是一个实例方法。 - gouessej
@gouessej 上述代码在PowerShell 7中可以直接使用。$s = 'All the HIP cats' 创建了一个 [System.String] 对象。在控制台中,您可以通过输入 $s. 然后反复按 Tab 键来循环查看可用的方法和属性,或者使用 $s | Get-Member 查看它们的列表。 - nmbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接