Você pode usar uma combinação de pwd
, Join-Path
e [System.IO.Path]::GetFullPath
para obter um caminho expandido totalmente qualificado.
Como cd
( Set-Location
) não altera o diretório de trabalho atual do processo, simplesmente passar um nome de arquivo relativo a uma API .NET que não entende o contexto do PowerShell pode ter efeitos colaterais indesejados, como resolver para um caminho baseado no trabalho inicial diretório (não sua localização atual).
O que você faz é primeiro qualificar seu caminho:
Join-Path (Join-Path (pwd) fred\frog) '..\frag'
Isso produz (dada minha localização atual):
C:\WINDOWS\system32\fred\frog\..\frag
Com uma base absoluta, é seguro chamar a API .NET GetFullPath
:
[System.IO.Path]::GetFullPath((Join-Path (Join-Path (pwd) fred\frog) '..\frag'))
O que fornece o caminho totalmente qualificado e com o ..
removido:
C:\WINDOWS\system32\fred\frag
Também não é complicado, pessoalmente, desprezo as soluções que para isso dependem de scripts externos, é um problema simples resolvido de forma bastante adequada por Join-Path
e pwd
( GetFullPath
serve apenas para torná-lo bonito). Se você quiser manter apenas a parte relativa , basta adicionar .Substring((pwd).Path.Trim('\').Length + 1)
e pronto!
fred\frag
ATUALIZAR
Obrigado a @Dangph por apontar o C:\
caso extremo.