Вы можете использовать комбинацию pwd
, Join-Path
и [System.IO.Path]::GetFullPath
, чтобы получить полностью определенный расширенный путь.
Поскольку cd
(Set-Location
) не изменяет текущий рабочий каталог процесса, просто передача относительного имени файла в .NET API, который не понимает контекст PowerShell, может иметь непредвиденные побочные эффекты, такие как преобразование в путь, основанный на исходном рабочем каталоге (а не на вашем текущем местоположении).
Что вы делаете, так это сначала уточняете свой путь:
Join-Path (Join-Path (pwd) fred\frog) '..\frag'
Это дает (учитывая мое текущее местоположение):
C:\WINDOWS\system32\fred\frog\..\frag
С абсолютной базой безопасно вызывать .NET API GetFullPath
:
[System.IO.Path]::GetFullPath((Join-Path (Join-Path (pwd) fred\frog) '..\frag'))
, который дает вам полный путь и с удаленным ..
:
C:\WINDOWS\system32\fred\frag
Это тоже не сложно, лично я презираю решения, которые для этого зависят от внешних сценариев, это простая задача, довольно удачно решаемая с помощью Join-Path
и pwd
(GetFullPath
просто для того, чтобы сделать ее красивой). Если вы хотите оставить только только относительную часть , просто добавьте .Substring((pwd).Path.Trim('\').Length + 1)
и вуаля!
fred\frag
UPDATE
Спасибо @Dangph за указание на край C:\
.