Sie können eine Kombination von verwenden pwd
, Join-Path
und [System.IO.Path]::GetFullPath
einen 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-Path
und gelöst wird pwd
( GetFullPath
nur 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:\
.