Создать новый абсолютный путь из абсолютного пути + относительный или абсолютный путь

Я работаю над сценарием сборки, используя 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 это не командлет для использования, но я не смог найти никаких ресурсов о том, как делать то, что я хочу. Есть ли простая однострочная для выполнения того, что мне нужно?

2 ответа

Решение

Вы могли бы использовать GetFullPath(), но вам нужно будет использовать "хак", чтобы он использовал ваше текущее местоположение в качестве текущего каталога (для разрешения относительных путей). Перед использованием исправления текущий каталог метода.NET является рабочим каталогом процесса, а не местом, которое вы указали в процессе PowerShell. См. Почему объекты.NET в PowerShell не используют текущий каталог?

#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
    }
}
Другие вопросы по тегам