Sie können eine Kombination von verwenden pwd, Join-Pathund [System.IO.Path]::GetFullPatheinen vollständig qualifizierten gespreizten Weg zu bekommen.
Da cd( Set-Location) das aktuelle Arbeitsverzeichnis des Prozesses nicht ändert, kann die einfache Übergabe eines relativen Dateinamens an eine .NET-API, die den PowerShell-Kontext nicht versteht, unbeabsichtigte Nebenwirkungen haben, z. B. das Auflösen in einen Pfad, der auf der anfänglichen Arbeit basiert Verzeichnis (nicht Ihr aktueller Standort).
Was Sie tun, ist, dass Sie zuerst Ihren Weg qualifizieren:
Join-Path (Join-Path (pwd) fred\frog) '..\frag'
Dies ergibt (angesichts meines aktuellen Standorts):
C:\WINDOWS\system32\fred\frog\..\frag
Mit einer absoluten Basis ist es sicher, die .NET-API aufzurufen GetFullPath:
[System.IO.Path]::GetFullPath((Join-Path (Join-Path (pwd) fred\frog) '..\frag'))
Welches gibt Ihnen den voll qualifizierten Weg und mit dem ..entfernten:
C:\WINDOWS\system32\fred\frag
Es ist auch nicht kompliziert, persönlich, ich verachte die Lösungen, die von externen Skripten abhängen, es ist ein einfaches Problem, das ziemlich treffend durch Join-Pathund gelöst wird pwd( GetFullPathnur um es hübsch zu machen). Wenn Sie nur den relativen Teil behalten möchten, fügen Sie einfach hinzu .Substring((pwd).Path.Trim('\').Length + 1)und voila!
fred\frag
AKTUALISIEREN
Vielen Dank an @Dangph für den Hinweis auf den Randfall C:\.