如何解决Replace string方法的区分大小写?

时间:2016-01-26 17:53:11

标签: regex powershell sccm

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

例如,Powershell的.Replace方法区分大小写,并且有时候某人在服务器名称中仅在名称的PART中使用大写字母。

\\typNUMloc\可以是\\typNUMLOC\\\TYPNUMloc\\\TYPNUMLOC\。这会产生超大的If语句。

我的一个功能是驱动程序(不是驱动程序包,我用相似的代码测试过,而且我只有一个错误的路径)。为了安全起见,Big Red Button注释掉了。

$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"
}

1 个答案:

答案 0 :(得分:0)

我认为您的问题可能是假设您必须转义替换字符串以及模式字符串。事实并非如此。由于您有控制字符(斜杠),因此您需要转义模式字符串。在它的基本形式中你只需要做这样的事情:

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,因为你检查了一下是否发生了变化。再说一次,如果您只是为了解决案例而创建所有这些陈述,那么我的建议就没有实际意义了。