我使用psake在构建脚本工作,我需要创建从当前工作目录的绝对路径与既可以是一个相对或绝对路径输入的路径。
假设当前位置是C:\MyProject\Build
$outputDirectory = Get-Location | Join-Path -ChildPath ".\output"
给C:\MyProject\Build\.\output
,这并不可怕,但我想没有.\
。 我可以通过解决这个问题Path.GetFullPath
。
问题出现时,我希望能够提供绝对路径
$outputDirectory = Get-Location | Join-Path -ChildPath "\output"
给C:\MyProject\Build\output
,在这里我需要C:\output
代替。
$outputDirectory = Get-Location | Join-Path -ChildPath "F:\output"
给C:\MyProject\Build\F:\output
,在那里我需要F:\output
代替。
我试图用Resolve-Path
,但总是抱怨的路径不存在。
我假设Join-Path
是不使用该cmdlet,但我一直没能找到如何做我想做的任何资源。 有一个简单的一行来完成我需要什么?
你可以使用GetFullPath()
但你需要使用“黑客”,以使其使用您的当前位置作为当前目录(解析相对路径)。 使用修复之前,.NET方法的当前目录是进程的工作目录,而不是你的PowerShell进程中指定的位置。 请参阅为什么在PowerShell中使用当前目录中没有的.NET对象?
#Hack to make .Net methods use the shells current directory instead of the working dir for the process
[System.Environment]::CurrentDirectory = (Get-Location)
".\output", "\output", "F:\output" | ForEach-Object {
[System.IO.Path]::GetFullPath($_)
}
输出:
C:\Users\Frode\output
C:\output
F:\output
像这样的东西应该为你工作:
#Hack to make .Net methods use the shells current directory instead of the working dir for the process
[System.Environment]::CurrentDirectory = (Get-Location)
$outputDirectory = [System.IO.Path]::GetFullPath(".\output")
我不认为有一个简单的一行。 但我认为你需要创建的路径无论如何,如果不存在呢? 那么,为什么不只是测试,并创建了吗?
cd C:\
$path = 'C:\Windows', 'C:\test1', '\Windows', '\test2', '.\Windows', '.\test3'
foreach ($p in $path) {
if (Test-Path $p) {
(Get-Item $p).FullName
} else {
(New-Item $p -ItemType Directory).FullName
}
}