如何在PowerShell中基于相对路径或绝对路径获得绝对路径



考虑以下情况:我有一个参数或配置变量,用于设置脚本的输出目录。显然,这个参数也应该是绝对的:

RepoBackup.ps1 -OutputDirectory .out
RepoBackup.ps1 -OutputDirectory D:backup

在脚本中,我使用(Get-Item -Path './').FullNameJoin-Path来确定输出目录的绝对路径,因为我可能需要使用Set-Location来更改当前目录,这使得使用相对路径变得复杂。

但是:

Join-Path C:code .out  # => C:code.out  (which is exactly what i need)
Join-Path C:code D:    # => C:codeD:    (which is not only not what i need, but invalid)

我考虑过使用Resolve-Path并执行类似Resolve-Path D:backup的操作,但如果目录(还(不存在,则会产生无法找到路径的错误。

那么,我如何获得$OutputDirectory的绝对路径,接受绝对和相对输入,以及还不存在的路径?

这个函数为我完成了任务:

function Join-PathOrAbsolute ($Path, $ChildPath) {
if (Split-Path $ChildPath -IsAbsolute) {
Write-Verbose ("Not joining '$Path' with '$ChildPath'; " +
"returning the child path as it is absolute.")
$ChildPath
} else {
Write-Verbose ("Joining path '$Path' with '$ChildPath', " +
"child path is not absolute")
Join-Path $Path $ChildPath
}
}
# short version, without verbose messages:
function Join-PathOrAbsolute ($Path, $ChildPath) {
if (Split-Path $ChildPath -IsAbsolute) { $ChildPath }
else { Join-Path $Path $ChildPath }
}
Join-PathOrAbsolute C:code .out  # => C:code.out (just the Join-Path output)
Join-PathOrAbsolute C:code D:   # => D: (just the $ChildPath as it is absolute)

它只是检查后一个路径是否是绝对的,如果是则返回,否则它只在$Path$ChildPath上运行Join-Path。注意,这并不认为基本$Path是相对的,但对于我的用例来说,这已经足够了。(我使用(Get-Item -Path './').FullName作为基本路径,这无论如何都是绝对的。(

Join-PathOrAbsolute . D:    # => D:
Join-PathOrAbsolute . .out  # => ..out

请注意,虽然..C:code.out看起来确实很奇怪,但它是有效的,并解析为正确的路径。毕竟,它只是PowerShell集成的Join-Path函数的输出。

您可以使用.Net Path.Combine方法,它完全可以满足您的需要。

[IO.Path]::Combine('C:code', '.out')  # => 'C:code.out'
[IO.Path]::Combine('C:code', 'D:')    # => 'D:'

相关内容

  • 没有找到相关文章

最新更新