Public/Output/Invoke-PathShortener.ps1
function Invoke-PathShortener { [CmdletBinding()] param ( # Path to shorten. [Parameter(Position = 0, Mandatory = $false , ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [ValidateNotNullorEmpty()] [string]$Path = $ExecutionContext.SessionState.Path.CurrentLocation.Path, # Number of parts to keep before truncating. Default value is 2. [Parameter()] [ValidateRange(0, [int32]::MaxValue)] [int]$KeepBefore = 2, # Number of parts to keep after truncating. Default value is 1. [Parameter()] [ValidateRange(1, [int32]::MaxValue)] [int]$KeepAfter = 1, # Path separator character. [Parameter()] [string]$Separator = [System.IO.Path]::DirectorySeparatorChar, # Truncate character(s). Default is '...' # Use '[char]8230' to use the horizontal ellipsis character instead. [Parameter()] [string]$TruncateChar = [char]8230 ) process { $Path = (Resolve-Path -Path $Path).Path $splitPath = $Path.Split($Separator, [System.StringSplitOptions]::RemoveEmptyEntries) if ($splitPath.Count -gt ($KeepBefore + $KeepAfter)) { $outPath = [string]::Empty for ($i = 0; $i -lt $KeepBefore; $i++) { $outPath += $splitPath[$i] + $Separator } $outPath += "$($TruncateChar)$($Separator)" for ($i = ($splitPath.Count - $KeepAfter); $i -lt $splitPath.Count; $i++) { if ($i -eq ($splitPath.Count - 1)) { $outPath += $splitPath[$i] } else { $outPath += $splitPath[$i] + $Separator } } } else { $outPath = $splitPath -join $Separator if ($splitPath.Count -eq 1) { $outPath += $Separator } } } End { return $outPath } } |