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

在您提供的示例源和目标结构中,源中的所有内容都存在于目标中。但你也谈到了“最佳匹配”,你没有任何例子。什么是匹配,什么使这种匹配成为最佳匹配?在您提供的示例源和目标结构中,源中的所有内容都存在于目标中。但你也谈到了“最佳匹配”,你没有任何例子。什么才算是比赛?是什么让这样的比赛成为最好的比赛?