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