从PowerShell中的绝对路径获取相对路径 [英] Getting relative path from absolute path in PowerShell
问题描述
您有一条绝对路径,但您希望它相对于另一条路径.
You have an absolute path, but you want it to be relative to another path.
示例:
P:/SO/data/database.txt
--> Now we want the filename to be relative to: P:/SO/team/lists/
../../data/database.txt
我已经发现堆栈溢出 问题 如何将绝对路径转换为相对路径在PowerShell中? .
I have already found the Stack Overflow question How to convert absolute path to relative path in PowerShell?.
一个答案链接到已经开发的Cmdlet ,但是这个对我不起作用.使用Set/Get-Location
的技巧要求路径存在.
One answer links to an already developed Cmdlet, but this one didn't work for me. And the trick using Set/Get-Location
requires the paths to exist.
推荐答案
解决方案
我从用PHP编写的 Gordon 中找到了答案:
The solution
I found an answer from Gordon written in PHP: Getting relative path from absolute path in PHP.
这是我到PowerShell的端口:
Here is my port to PowerShell:
<# This is probably not the best code I've ever written, but
I think it should be readable for most (advanced) users.
I will wrap this function into a Cmdlet when I have time to do it.
Feel free to edit this answer and improve it!
#>
function getRelativePath([string]$from, [string]$to, [string]$joinSlash='/') {
$from = $from -replace "(\\)", "/";
$to = $to -replace "(\\)", "/";
$fromArr = New-Object System.Collections.ArrayList;
$fromArr.AddRange($from.Split("/"));
$relPath = New-Object System.Collections.ArrayList;
$relPath.AddRange($to.Split("/"));
$toArr = New-Object System.Collections.ArrayList;
$toArr.AddRange($to.Split("/"));
for ($i=0; $i -lt $fromArr.Count; $i++) {
$dir = $fromArr[$i];
# Find first non-matching directory
if ($dir.Equals($toArr[$i])) {
# ignore this directory
$relPath.RemoveAt(0);
}
else {
# Get number of remaining directories to $from
$remaining = $fromArr.Count - $i;
if ($remaining -gt 1) {
# Add traversals up to first matching directory
$padLength = ($relPath.Count + $remaining - 1);
# Emulate array_pad() from PHP
for (; $relPath.Count -ne ($padLength);) {
$relPath.Insert(0, "..");
}
break;
}
else {
$relPath[0] = "./" + $relPath[0];
}
}
}
return $relPath -Join $joinSlash;
}
注意: -您 From 路径必须以斜线结尾!
Attention: - You From path has to end with a slash!
getRelativePath -From "P:/SO/team/lists/" -To "P:/SO/data/database.txt";
--> ../../data/database.txt
getRelativePath -From "C:/Windows/System32/" -To "C:/Users/ComFreek/Desktop/SO.txt";
--> ../../Users/ComFreek/Desktop/SO.txt
这篇关于从PowerShell中的绝对路径获取相对路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!