gpt4 book ai didi

regex - 如何解决“替换字符串”方法区分大小写的问题?

转载 作者:行者123 更新时间:2023-12-03 00:15:41 25 4
gpt4 key购买 nike

我将SCCM中几乎所有内容的内容源都移到了DFS共享中,因此,我必须更改环境中所有内容的源路径,并且在大多数情况下,我已将其编码。我想做一些改进,以便在我按下红色的大按钮之前清理代码。

例如,Powershell的.Replace方法区分大小写,并且有时有人在服务器名称中仅在名称的PART中使用大写字母。
\\typNUMloc\可以是\\typNUMLOC\\\TYPNUMloc\\\TYPNUMLOC\。这使得特大的If语句成为可能。

我的功能之一是用于驱动程序(不是驱动程序包,我已经用类似的代码进行了测试,并且我只有一个错误键入的路径)。大红色按钮出于安全原因被注释掉。

$DriverArray = Get-CMDriver | Select CI_ID, ContentSourcePath | Where-Object {$_.ContentSourcePath -Like "\\oldNUMsrv\*"}
Foreach ($Driver in $DriverArray) {
$DriverID = $Driver.CI_ID
$CurrPath = $Driver.ContentSourcePath

# Checks and replaces the root path
If ($CurrPath -split '\\' -ccontains 'path_dir') {
$NewPath = $CurrPath.Replace("oldNUMsrv\path_dir","dfs\Path-Dir")
#Set-CMDriver -Id $DriverID -DriverSource $NewPath
} ElseIf ($CurrPath -split '\\' -ccontains 'Path_dir') {
$NewPath = $CurrPath.Replace("oldNUMsrv\Path_dir","dfs\Path-Dir")
#Set-CMDriver -Id $DriverID -DriverSource $NewPath
} ElseIf ($CurrPath -split '\\' -ccontains 'Path_Dir') {
$NewPath = $CurrPath.Replace("oldNUMsrv\Path_Dir","dfs\Path-Dir")
#Set-CMDriver -Id $DriverID -DriverSource $NewPath
} Else {
Write-Host "Bad Path at $DriverID -- $CurrPath" -ForegroundColor Red
}

# Checks again for ones that didn't change propery (case issues)
If ($NewPath -like "\\oldNUMsrv\*") {
Write-Host "Bad Path at $DriverID -- $CurrPath" -ForegroundColor Red
}
}

但是正如您所知道的,这是我不需要做的很多代码。我知道,我可以使用 -replace-ireplace方法,但是即使在使用 \\dfs\\Path-Dir时,我在路径中也会遇到其他反斜杠( [regex]::escape)。

如何使用不同路径的数组来匹配 $CurrPath并执行替换?我知道它不起作用,但是像这样:
If ($Array -in $CurrPath) {
$NewPath = $CurrPath.Replace($Array, "dfs\Path-Dir"
}

最佳答案

我认为您的问题可能是假设您必须转义替换字符串以及模式字符串。事实并非如此。由于您具有控制字符(斜杠),因此需要对模式字符串进行转义。在基本形式中,您只需要执行以下操作:

PS C:\Users\Matt> "C:\temp\test\file.php" -replace [regex]::Escape("temp\test"), "another\path"
C:\another\path\file.php

但是,我想更进一步。您的if语句都在做相对相同的事情。查找一系列字符串,并用相同的内容替换它们。 -contains也不是必须的。还要注意,所有这些比较运算符默认情况下都不区分大小写。参见 about_comparison_operators

您可以通过构建模式字符串,用更多的正则表达式简化所有操作。因此,假设您的字符串都是唯一的(大小写无关紧要),则可以执行以下操作:
$stringstoReplace = "oldNUMsrv1\path_dir", "oldNUMsrv2\Path_dir", "oldNUMsrv1\Path_Dir"
$regexPattern = ($stringstoReplace | ForEach-Object{[regex]::Escape($_)}) -join "|"

if($CurrPath -match $regexPattern){
$NewPath = $CurrPath -replace $regexPattern,"new\path"
}

您甚至不需要 if。无论如何,您都可以在所有字符串上使用 -replace。我只留下了 if,因为您检查了一下是否有所更改。再说一次,如果您只是为了说明情况而创建所有这些语句,那么我的建议就没有意义了。

关于regex - 如何解决“替换字符串”方法区分大小写的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35020530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com