Regex 比较文件夹
我试图比较两种文件夹结构: 源结构Regex 比较文件夹,regex,powershell,Regex,Powershell,我试图比较两种文件夹结构: 源结构 $SrcFolders C:\Temp\FolderName\FolderA C:\Temp\FolderName\FolderB\SubFolderBA C:\Temp\FolderName\FolderB\SubFolderBB C:\Temp\FolderName\FolderC $TrgFolders S:\Docs\FolderName\FolderA S:\Docs\FolderName\FolderB\SomethingWrong S:\D
$SrcFolders
C:\Temp\FolderName\FolderA
C:\Temp\FolderName\FolderB\SubFolderBA
C:\Temp\FolderName\FolderB\SubFolderBB
C:\Temp\FolderName\FolderC
$TrgFolders
S:\Docs\FolderName\FolderA
S:\Docs\FolderName\FolderB\SomethingWrong
S:\Docs\FolderName\FolderB\SubFolderBA
S:\Docs\FolderName\FolderB\SubFolderBB
S:\Docs\FolderName\FolderB\SubFolderBB\SomethingWrong
S:\Docs\FolderName\FolderC
S:\Docs\FolderName\SomethingWrong
目标结构
$SrcFolders
C:\Temp\FolderName\FolderA
C:\Temp\FolderName\FolderB\SubFolderBA
C:\Temp\FolderName\FolderB\SubFolderBB
C:\Temp\FolderName\FolderC
$TrgFolders
S:\Docs\FolderName\FolderA
S:\Docs\FolderName\FolderB\SomethingWrong
S:\Docs\FolderName\FolderB\SubFolderBA
S:\Docs\FolderName\FolderB\SubFolderBB
S:\Docs\FolderName\FolderB\SubFolderBB\SomethingWrong
S:\Docs\FolderName\FolderC
S:\Docs\FolderName\SomethingWrong
我正试图找到最好的匹配:
- 当目标文件夹和源文件夹相同时,即为目标文件夹
- 如果它们不相同,则需要源中最长的匹配项
$Source = 'C:\Temp\FolderName\'
$Target = 'S:\Docs\FolderName'
foreach ($t in ($TrgFolders.FullName)) {
$Folder = $t.Replace($Target,$Source)
# Exact match
# 'S:\Docs\FolderName\FolderA' > Desired result: 'C:\Temp\FolderName\FolderA'
if ($SrcFolders.FullName -contains $Folder) {
$FileACL = Get-Acl ($Folder + '\' + $TempFile)
break
}
# Next best match
# 'S:\Docs\FolderName\FolderB\SomethingWrong' > Desired result: 'C:\Temp\FolderName\FolderB'
# 'S:\Docs\FolderName\FolderB\SubFolderBB\SomethingWrong' > Desired result: 'C:\Temp\FolderName\FolderB\SubFolderBB'
$F = $SrcFolders.FullName | where {$_ -like "$Folder*"} | sort length | select -First 1
$FileACL = Get-Acl ($F + '\' + $TempFile)
}
正如您所见,使用
-contains
查找精确匹配很容易,但查找次优匹配实际上并不奏效。。谢谢你的帮助。与此同时,我已经解决了自己的问题:
foreach ($t in ($TrgFolders.FullName)) {
$SrcFolder = $t.Replace($Target,$Source)
$Split = $SrcFolder.Split('\')
for ($i=1; $i -lt $Split.count; $i++) {
$R = $Split[0..($Split.Count-$i)] -join '\'
if ($SrcFolders.FullName -contains $R) {
$FileACL = Get-Acl ($R + '\' + $TempFile)
break
}
}
}
与此同时,我解决了自己的问题:
foreach ($t in ($TrgFolders.FullName)) {
$SrcFolder = $t.Replace($Target,$Source)
$Split = $SrcFolder.Split('\')
for ($i=1; $i -lt $Split.count; $i++) {
$R = $Split[0..($Split.Count-$i)] -join '\'
if ($SrcFolders.FullName -contains $R) {
$FileACL = Get-Acl ($R + '\' + $TempFile)
break
}
}
}
在您提供的示例源和目标结构中,源中的所有内容都存在于目标中。但你也谈到了“最佳匹配”,你没有任何例子。什么是匹配,什么使这种匹配成为最佳匹配?在您提供的示例源和目标结构中,源中的所有内容都存在于目标中。但你也谈到了“最佳匹配”,你没有任何例子。什么才算是比赛?是什么让这样的比赛成为最好的比赛?