考虑以下情况:我有一个参数或配置变量,用于设置脚本的输出目录。显然,这个参数也应该是绝对的:
RepoBackup.ps1 -OutputDirectory .out
RepoBackup.ps1 -OutputDirectory D:backup
在脚本中,我使用(Get-Item -Path './').FullName
和Join-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:'