从绝对路径+相对或绝对路径创建新的绝对路径

时间:2015-03-21 22:36:58

标签: powershell psake

我正在使用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,但我找不到任何关于如何做我想要的资源。是否有一个简单的单行来完成我的需要?

2 个答案:

答案 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
    }
}