Można użyć kombinacji pwd
, Join-Path
i [System.IO.Path]::GetFullPath
aby uzyskać pełną rozszerzoną ścieżkę.
Ponieważ cd
( Set-Location
) nie zmienia bieżącego katalogu roboczego procesu, po prostu przekazanie względnej nazwy pliku do interfejsu API .NET, które nie rozumie kontekstu programu PowerShell, może mieć niezamierzone skutki uboczne, takie jak rozpoznawanie ścieżki na podstawie początkowej pracy katalog (nie bieżąca lokalizacja).
Najpierw kwalifikujesz swoją ścieżkę:
Join-Path (Join-Path (pwd) fred\frog) '..\frag'
To daje (biorąc pod uwagę moją obecną lokalizację):
C:\WINDOWS\system32\fred\frog\..\frag
Mając absolutną podstawę, można bezpiecznie wywołać interfejs .NET API GetFullPath
:
[System.IO.Path]::GetFullPath((Join-Path (Join-Path (pwd) fred\frog) '..\frag'))
Co daje w pełni kwalifikowaną ścieżkę i ..
usunięte:
C:\WINDOWS\system32\fred\frag
To też nie jest skomplikowane, osobiście gardzę rozwiązaniami, które w tym zakresie zależą od zewnętrznych skryptów, jest to prosty problem rozwiązany dość trafnie przez Join-Path
i pwd
( GetFullPath
ma tylko uczynić go ładnym). Jeśli chcesz zachować tylko względną część , po prostu dodaj .Substring((pwd).Path.Trim('\').Length + 1)
i voila!
fred\frag
AKTUALIZACJA
Podziękowania dla @Dangph za wskazanie C:\
przypadku krawędzi.