有时我有多个“根”,我想从中生成相对文件路径。我发现Resolve-Path -Relative
在这种情况下无法使用。更改全局设置、当前位置以生成相对文件路径似乎容易出错并且(如果您正在编写并行代码)可能不是线程安全的。
以下内容应适用于早期或最新版本的 Powershell 和 Powershell Core,不会更改您的当前目录,即使是暂时的,并且是独立于操作系统和线程安全的。
它没有解决 OP 中的第二个示例(..
根据需要插入。)
function Get-RelativePath {
param($path, $relativeTo)
# strip trailing slash
$relativeTo = Join-Path `
(Split-Path -Parent $relativeTo) `
(Split-Path -Leaf $relativeTo)
$relPath = Split-Path -Leaf $path
$path = Split-Path -Parent $path
do {
$leaf = Split-Path -Leaf $path
$relPath = Join-Path $leaf $relPath
$path = Split-Path -Parent $path
} until (($path -eq $relativeTo) -Or ($path.Length -eq 0))
$relPath
}
一个例子:
PS> $configRoot = 'C:\Users\P799634t\code\RMP\v2\AWD'
PS> $queryPath = 'C:\Users\P799634t\code\RMP\v2\AWD\config_queries\LOAD_UNQ_QUEUE_QUERY2.sql'
PS> Write-Host (Get-RelativePath $queryPath $configRoot)
config_queries\LOAD_UNQ_QUEUE_QUERY2.sql
当一个文件路径不是另一个文件路径的子路径时,它的行为合理:
PS> $root = 'C:\Users\P799634t\code\RMP\v2\AWD'
PS> $notRelated = 'E:\path\to\origami'
PS> Write-Host (Get-RelativePath $notRelated $root)
E:\path\to\origami