鉴于两条任意路径base
和destination
,我想找到从base
到destination
的最小相对路径。
我目前的实施是:
Push-Location $base
try {
return (Resolve-Path -relative $destination)
} finally {
Pop-Location
}
但是,这并不能满足最小化的要求。例如,给定两个路径C:\A\B\C
和C:\A\B
,我得到..\..\B
,结果实际上应该是..
。值得注意的是,如果destination
是一个文件,这确实是最小的,但不适用于文件夹。
我很乐意不做手动截断或类似的事情。
答案 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 }
}