不区分大小写的PowerShell替代品

Bra*_*rad 21 powershell replace case

我有以下PowerShell脚本:

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

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

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

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

是否有捷径可寻?

Rya*_*ton 27

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

您需要更改此行:

$NullSessionPipes =  $NullSessionPipes.replace("browser", "")
Run Code Online (Sandbox Code Playgroud)

对此:

$NullSessionPipes =  $NullSessionPipes -ireplace [regex]::Escape("browser"), ""
Run Code Online (Sandbox Code Playgroud)

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

$NullSessionPipes =  $NullSessionPipes -ireplace [regex]::Escape($stringToReplace), $stringToReplaceItWith
Run Code Online (Sandbox Code Playgroud)


Sha*_*evy 10

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

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

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


And*_*ndi 6

改为使用正则表达式替换:

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

  • 在这种情况下,它是一个静态已知字符串 如果搜索字符串未知(变量),您可以使用`[regex] :: escape($ search_string)自动转义它. (2认同)

Cha*_*ynt 5

.Replace方法不具有区分敏感的选项:

String.Replace 方法

...此方法执行顺序(区分大小写和不区分区域性)搜索...

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

这个问题的其他答案建议使用-replaceor -ireplace,如果您想使用正则表达式替换,这很好。然而,正如@Bob 在他(她?)的评论中提到的,这并不总是合适的。例如,如果您想在替换文本中包含诸如$_ 之类的文字字符串。

从其他区分大小写的地方借用的一个技巧是将“输入”字符串和“搜索”字符串转换为小写:

[PS]> "TeXT".ToLower().Replace("text","NewString")
NewString
Run Code Online (Sandbox Code Playgroud)

但是...这会导致任何与搜索字符串不匹配的内容的输出都为小写,这很可能是不可接受的。

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


nmb*_*ell 5

String.Replace 方法有两个不同的重载,允许不区分大小写的替换:

替换(字符串、字符串、字符串比较)

替换(字符串、字符串、布尔值、CultureInfo)

对于第一个,您需要选择一个忽略大小写的StringComparison,例如 OrdinalIgnoreCase。对于第二个,它是控制区分大小写的布尔值;CultureInfo 的 null 使用当前区域性。

在 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
Run Code Online (Sandbox Code Playgroud)