# parent dir of this actual script (which should be the getdown appdir/bin). Follow all symlinks. Like GNU readlink -f
function Readlink-f {
- Param($Link)
- $dirs = @()
- $dir = Convert-Path $Link
- while ( $dir ) {
- $dirs = @( Split-Path $dir -Leaf ) + $dirs
- $dir = Split-Path $dir -Parent
+ Param(
+ [Parameter(mandatory=$true, ValueFromPipeline=$true)]$Link,
+ [Parameter()]$iteration_count = 1
+ )
+ if ( $iteration_count -ge 100 ) {
+ Write-Error "Readlink-f iterated 100 times"
+ return $Link
}
- $real = Get-Item "/"
- foreach ($d in $dirs) {
- $real = Join-Path -Path $real -ChildPath $d
- $item = Get-Item $real
- if ($item.Target -ne $null) {
- $real = Convert-Path $item.Target
+ if ( $Link -eq "" -or $Link -eq $null ) {
+ return $null
+ }
+ $path_components = @()
+ $dir = Get-Item $Link
+ while ( $dir -ne $null ) {
+ while ( $dir.Target -ne $null ) {
+ # [System.IO.Path]::Combine caters for a multitude of sins that it's almost impossible to deal with with Join-Path
+ $dir = Get-Item ([System.IO.Path]::GetFullPath( [System.IO.Path]::Combine( (Split-Path $dir -Parent), $dir.Target )))
}
+ $parent = Split-Path -Path $dir -Parent
+ $path_components = @( (Split-Path -Path $dir -Leaf) ) + $path_components
+ $dir = Readlink-f $parent ($iteration_count + 1)
+ }
+ $real = Get-Item "/"
+ foreach ( $component in $path_components) {
+ # [System.IO.Path]::Combine caters for a multitude of sins that it's almost impossible to deal with with Join-Path
+ $real = Get-Item ([System.IO.Path]::GetFullPath( [System.IO.Path]::Combine( $real, $component )))
}
$real
}