man-highlighting.psm1
# Overrides the original Get-Help command to colorize its output. Function Get-Help { [CmdletBinding(DefaultParameterSetName='AllUsersView', HelpUri='https://go.microsoft.com/fwlink/?LinkID=2096483')] param( [Parameter(Position=0, ValueFromPipelineByPropertyName=$true)] [ValidateNotNullOrEmpty()] [string] ${Name}, [string] ${Path}, [ValidateSet('Alias','Cmdlet','Provider','General','FAQ','Glossary','HelpFile','ScriptCommand','Function','Filter','ExternalScript','All','DefaultHelp','DscResource','Class','Configuration')] [string[]] ${Category}, [Parameter(ParameterSetName='DetailedView', Mandatory=$true)] [switch] ${Detailed}, [Parameter(ParameterSetName='AllUsersView')] [switch] ${Full}, [Parameter(ParameterSetName='Examples', Mandatory=$true)] [switch] ${Examples}, [Parameter(ParameterSetName='Parameters', Mandatory=$true)] [string[]] ${Parameter}, [string[]] ${Component}, [string[]] ${Functionality}, [string[]] ${Role}, [Parameter(ParameterSetName='Online', Mandatory=$true)] [switch] ${Online}, [Parameter(ParameterSetName='ShowWindow', Mandatory=$true)] [switch] ${ShowWindow} ) process { # Get the resolved command in case an alias has been passed $commandName = if( $Name ) { (Get-Command $Name).ForEach{ $_.ResolvedCommandName ?? $_.Name } } else { 'Get-Help' } # Escape command name for use in RegEx pattern $commandNameEscaped = [regex]::Escape( $commandName ) # The styles to apply $style = @{ SECTION = $PSStyle.Foreground.FromRgb(239,155,64) COMMAND = $PSStyle.Foreground.BrightYellow PARAM = $PSStyle.Foreground.FromRgb(160,199,75) } # Patterns with named capturing groups that match the $style keys $regEx = @( "(?m)(?<=^[ \t]*)(?<SECTION>[A-Z][A-Z \t\d\W]+$)" "(?<COMMAND>\b$commandNameEscaped\b)" "(?<PARAM>\B-\w+)" ) -join '|' # Call the original Get-Help command Microsoft.PowerShell.Core\Get-Help @PSBoundParameters | Out-String | ForEach-Object { [regex]::Replace( $_, $regEx, { # Get the RegEx group that has matched. $matchGroup = $args.Groups.Where{ $_.Success }[ 1 ] # Use the RegEx group name to select associated style for colorizing the match. $style[ $matchGroup.Name ] + $matchGroup.Value + $PSStyle.Reset }) } } } |