1

我正在使用 psake 编写构建脚本,我需要从当前工作目录创建一个绝对路径,输入路径可以是相对路径或绝对路径。

假设当前位置是C:\MyProject\Build

$outputDirectory = Get-Location | Join-Path -ChildPath ".\output"

Gives C:\MyProject\Build\.\output,这并不可怕,但我希望没有.\. 我可以通过使用来解决这个问题Path.GetFullPath

当我希望能够提供绝对路径时,问题就出现了

$outputDirectory = Get-Location | Join-Path -ChildPath "\output"

Gives C:\MyProject\Build\output,我需要的地方C:\output

$outputDirectory = Get-Location | Join-Path -ChildPath "F:\output"

Gives C:\MyProject\Build\F:\output,我需要的地方F:\output

我尝试使用Resolve-Path,但这总是抱怨路径不存在。

我假设Join-Path不是要使用的 cmdlet,但我找不到任何关于如何做我想做的事的资源。有没有简单的一条线来完成我所需要的?

4

2 回答 2

2

您可以使用GetFullPath(),但您需要使用“hack”来使其使用您当前的位置作为当前目录(以解析相对路径)。在使用修复之前,.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")
于 2015-03-21T23:24:01.537 回答
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
    }
}
于 2015-03-21T23:34:21.083 回答