解决相对路径

时间:2018-03-01 10:29:08

标签: powershell

鉴于两条任意路径basedestination,我想找到从basedestination的最小相对路径。

我目前的实施是:

Push-Location $base
try {
    return (Resolve-Path -relative $destination)
} finally {
    Pop-Location
}

但是,这并不能满足最小化的要求。例如,给定两个路径C:\A\B\CC:\A\B,我得到..\..\B,结果实际上应该是..。值得注意的是,如果destination是一个文件,这确实是最小的,但不适用于文件夹。

我很乐意不做手动截断或类似的事情。

2 个答案:

答案 0 :(得分:0)

我发现这个问题很有趣,所以我继续创建了这段可怕的代码,只是为了它的乐趣。向下投票你想要的一切。我为我的正则表达式感到骄傲。

if ($base -eq $destination) {
    return "."
}

if ($destination.StartsWith($base)) {
    # destination is inside base

    $baseRE = [regex]::Escape($base)
    return $destination -replace "$baseRE\\?", ""
} else {
    # destination is inside a parent of base

    if (!$base.StartsWith($destination)) {
        # destination is a file

        $fileDir = Split-Path $destination
        $destRE = [regex]::Escape($fileDir)

        $relativePathToFile = $base -replace "$destRE\\?", "" -replace "([^\\]+)", ".."
        $fileName = Split-Path $destination -Leaf

        return Join-Path $relativePathToFile $fileName
    }

    $destRE = [regex]::Escape($destination)
    return $base -replace "$destRE\\?", "" -replace "([^\\]+)", ".."
}

我想这不属于“手动截断或类似的东西。”?

答案 1 :(得分:0)

function GetRelative($base, $destination) {
    $baseUri = [System.Uri]$($base + '/')
    $destinationUri = [System.Uri]$($destination + '/')
    $relativePath = $baseUri.MakeRelativeUri($destinationUri).OriginalString.TrimEnd('/').Replace('/', '\');
    if ([string]::IsNullOrEmpty($relativePath)) { return "." }
    else { return $relativePath }
}