我正在使用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,但我找不到任何关于如何做我想要的资源。是否有一个简单的单行来完成我的需要?
答案 0 :(得分:2)
您可以使用GetFullPath()
,但是您需要使用“hack”使其使用当前位置作为当前目录(以解析相对路径)。在使用此修复程序之前,.NET方法的当前目录是进程的工作目录,而不是您在PowerShell进程中指定的位置。见Why don't .NET objects in PowerShell use the current directory?
#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")
答案 1 :(得分:2)
我不认为这是一个简单的单行。但我认为你还需要创建的路径,如果它还没有存在呢?那么为什么不测试并创造呢?
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
}
}