functions/utility/Join-PSFPath.ps1

function Join-PSFPath
{
<#
    .SYNOPSIS
        Performs multisegment path joins.
     
    .DESCRIPTION
        Performs multisegment path joins.
     
    .PARAMETER Path
        The basepath to join on.
     
    .PARAMETER Child
        Any number of child paths to add.
     
    .PARAMETER Normalize
        Normalizes path separators for the path segments offered.
        This ensures the correct path separators for the current OS are chosen.
     
    .EXAMPLE
        PS C:\> Join-PSFPath -Path 'C:\temp' 'Foo' 'Bar'
     
        Returns 'C:\temp\Foo\Bar'
     
    .EXAMPLE
        PS C:\> Join-PSFPath -Path 'C:\temp' 'Foo' 'Bar' -Normalize
     
        Returns 'C:\temp\Foo\Bar' on a Windows OS.
        Returns 'C:/temp/Foo/Bar' on most non-Windows OSes.
#>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [string]
        $Path,
        
        [Parameter(ValueFromRemainingArguments = $true)]
        [Alias('ChildPath')]
        [string[]]
        $Child,
        
        [switch]
        $Normalize
    )
    
    process
    {
        $resultingPath = $Path
        
        foreach ($childItem in $Child)
        {
            $resultingPath = Join-Path -Path $resultingPath -ChildPath $childItem
        }
        
        if ($Normalize)
        {
            $defaultSeparator = [System.IO.Path]::DirectorySeparatorChar
            $altSeparator = [System.IO.Path]::AltDirectorySeparatorChar
            # Alt Directory Separator Char is not reliable on all platforms
            if ($defaultSeparator -eq $altSeparator)
            {
                if ($defaultSeparator -eq '\') { $altSeparator = '/' }
                else { $altSeparator = '\' }
            }
            $resultingPath = $resultingPath.Replace($altSeparator, $defaultSeparator)
        }
        
        $resultingPath
    }
}