Создать новый абсолютный путь из абсолютного пути + относительный или абсолютный путь
Я работаю над сценарием сборки, используя 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
}
}