Functions/Resolve-RealPath.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

function Resolve-RealPath {
    <#
        .SYNOPSIS
        Implementation of Unix realpath().

        .PARAMETER Path
        Must exist
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Alias('FullName')]
        [string] $Path
    )

    if ($PSVersionTable.PSVersion.Major -lt 6 -or $IsWindows) {
        return [IO.Path]::GetFullPath($Path)
    }

    [string[]] $parts = ($Path.TrimStart([IO.Path]::DirectorySeparatorChar).Split([IO.Path]::DirectorySeparatorChar))
    [string] $realPath = ''
    foreach ($part in $parts) {
        $realPath += [string] ([IO.Path]::DirectorySeparatorChar + $part)
        $item = Get-Item $realPath
        if ($item.Target) {
            $realPath = $item.Target
        }
    }
    $realPath
}