Gumby.Path.psm1
<#
.SYNOPSIS Normalizes a path. .PARAMETER Path Path to normalize. .OUTPUTS Normalized path. #> function PathNormalize([string] $Path) { return $path.Replace('/', '\') } <# .SYNOPSIS Gets the path separator character for platform the function is running on. .OUTPUTS Path separator. #> function PathSeparator() { return '\' } <# .SYNOPSIS Gets a list of common path separator characters. .OUTPUTS List of common path separator characters. #> function PathSeparators() { return '/', '\' } <# .SYNOPSIS Extracts the base name part of a file path. .PARAMETER Path Path to extract base name part from. .OUTPUTS Base name part. #> function PathFileBaseName([string] $Path) { # a: Position after the last separator (if any) # b: Position of the last dot (if any) # "p" # 0 # a # b # "p.q" # 012 # a # b # "p.q.r" # 01234 # a # b # "p\q" # 012 # a # b # "p.q\r" # 01234 # a # b # "p\q.r\s.t.u" # 01234567890 # a # b [int] $a = $Path.LastIndexOf((PathSeparator)) if ($a -lt 0) { $a = 0 } else { ++$a } if ($a -ge $Path.Length) { return "" } [int] $b = $Path.LastIndexOf('.') if ($b -lt $a) { return $Path.Substring($a) } else { return $Path.Substring($a, $b - $a) } } <# .SYNOPSIS Joins file name parts into a path. .PARAMETER Directories Directory parts. .PARAMETER BaseName Base name part. .PARAMETER Extension Extension part. .OUTPUTS Joined path. #> function PathJoin([string[]]$Directories, [string] $BaseName, [string] $Extension) { $sb = [Text.StringBuilder]::new() foreach ($dir in $Directories) { $sb.Append($dir.Trim((PathSeparators))).Append((PathSeparator)) | Out-Null } $sb.Append($BaseName) | Out-Null if (![string]::IsNullOrEmpty($Extension)) { if ($Extension.StartsWith('.')) { $sb.Append($Extension) | Out-Null } else { $sb.Append('.').Append($Extension) | Out-Null } } return $sb.ToString() } function PathAsUri($Path) { return "file:$($Path.Replace('\', '/'))" } |