Functions/Format-WrapText.ps1

function Format-WrapText {
<#
.SYNOPSIS
    Wraps text at a particular column width
.DESCRIPTION
    Wraps text at a particular column width (Default=80). Function aliased to 'WrapText'.
.PARAMETER Text
    The text to be formatted
.PARAMETER Width
    Column width to wrap at. Default = 80
.PARAMETER Screen
    A switch indicating that the wrap should occur at the width of the current Powershell window.
.EXAMPLE
    Format-WrapText -Text "word1 word2 word3 word4 word5" -Width 12
 
    Would return
    word1 word2
    word3 word4
    word5
.OUTPUTS
    [String]
.LINK
    Format-Table
    Format-List
#>


    # todo Change += to System.Collections.Arraylist

    #region Parameter
    [CmdletBinding(ConfirmImpact = 'Low', DefaultParameterSetName = 'Width')]
    [alias('WrapText')]
    [OutputType('string')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '')]
    Param(
        [Parameter(Mandatory, HelpMessage = 'Enter a long string of text', Position = 0, ValueFromPipeline, ParameterSetName = 'Width')]
        [Parameter(Mandatory, HelpMessage = 'Enter a long string of text', Position = 0, ValueFromPipeline, ParameterSetName = 'Screen')]
        [string[]] $Text,

        [Parameter(ParameterSetName = 'Width')]
        [int] $Width = 80,

        [Parameter(ParameterSetName = 'Screen')]
        [switch] $Screen
    )
    #endregion Parameter

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
        Write-Verbose -Message "ParameterSetName [$($PsCmdlet.ParameterSetName)]"
        if ($PsCmdlet.ParameterSetName -eq 'Screen') {
            $Width = $host.UI.RawUI.WindowSize.Width - 1
            Write-Verbose -Message "Setting width to $Width"
        }
        $NewText = ''
    }

    process {
        foreach ($CurLine in $Text) {
            $NewText = @($NewText, $CurLine) -join ' '
        }
    }

    end {
        $NewText = $NewText.TrimStart().TrimEnd()
        Write-Verbose -Message "NewText is [$NewText]"
        $Words = $NewText -split '\s+'
        $Col = 0
        [string] $Line = $null
        foreach ( $Word in $Words ) {

            $Col += $Word.Length + 1
            Write-Verbose -Message "Currently on word [$Word], col [$Col]"
            if ( $Col -gt $Width ) {
                Write-Output -InputObject $Line
                [string] $Line = $null
                $Line += "$Word "
                $Col = 0 + $Word.Length + 1
            } else {
                $Line += "$Word "
            }
        }
        if ($null -ne $Line) {
            Write-Output -InputObject "$Line"
        }
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }
}