Public/ConvertTo-MarkdownTable.ps1
Function ConvertTo-MarkdownTable { <# .SYNOPSIS Converts a PowerShell object to a Markdown table. .DESCRIPTION Converts a PowerShell object to a Markdown table. .PARAMETER InputObject The PowerShell object to be converted. .PARAMETER Alignment The direction to align the text to in the table fields. .PARAMETER EscapeSyntax Escapes Markdown syntax characters in all fields. This can be useful when handling nested script blocks. .EXAMPLE ConvertTo-MarkdownTable -InputObject (Get-Service) .EXAMPLE Get-Command -Module Microsoft.PowerShell.Utility | ConvertTo-MarkdownTable -EscapeSyntax | Out-File "C:\Path\To\My\File.md" -Encoding "ASCII" -Append .EXAMPLE Get-Alias | ConvertTo-MarkdownTable -Alignment Center #> [CmdletBinding()] PARAM ( [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)] [Object]$InputObject, [Parameter(Mandatory=$false, Position=1, ValueFromPipeline=$false)] [ValidateSet("Center","Left","Right")] [String]$Alignment = "Left", [Parameter(Mandatory=$false)] [Switch]$EscapeSyntax ) #region BEGIN Block BEGIN { # Declare variables $Data = @() #initialize an empty string for markdown text $Results = '' } #endregion BEGIN Block #region PROCESS Block PROCESS { # Add Input Objects to Data $Data += $InputObject } #endregion PROCESS Block #region END Block END { IF ($Data) { # Get Property Names $Names = $Data[0].PSObject.Properties.Name # Create heading field $Heading = "| $($Names -join " | ") |`n" # Add to results $Results += $Heading # Create alignment field for each property $AlignmentFields = FOREACH ($Name in $Names) { SWITCH ($Alignment) { Center {":$("-" * ($Name.Length - 2)):"} Left {":$("-" * ($Name.Length - 1))"} Right {"$("-" * ($Name.Length - 1)):"} } } # Join alignment fields $TableAlignment = "| $($AlignmentFields -join " | ") |`n" # Add to results $Results += $TableAlignment FOREACH ($Entry in $Data) { # Declare variables $values = @() # Declare counter $i = 0 # Add value for each property to $Values variable WHILE ($i -lt $Names.count) { $Values += $Entry.($Names[$i]) $i++ } IF ($EscapeSyntax) { # Force typecast values to string $Values = $Values | %{([String]$_)} # Escape all markdown syntax characters $Values = $Values.Replace('\','\\') $Values = $Values.Replace('`','\`') $Values = $Values.Replace('*','\*') $Values = $Values.Replace('_','\_') $Values = $Values.Replace('{','\{') $Values = $Values.Replace('}','\}') $Values = $Values.Replace('[','\[') $Values = $Values.Replace(']','\]') $Values = $Values.Replace('<','\<') $Values = $Values.Replace('>','\>') $Values = $Values.Replace('(','\(') $Values = $Values.Replace(')','\)') $Values = $Values.Replace('#','\#') $Values = $Values.Replace('+','\+') $Values = $Values.Replace('-','\-') $Values = $Values.Replace('.','\.') $Values = $Values.Replace('!','\!') $Values = $Values.Replace('|','\|') $Values = $Values.Replace('=','\=') $Values = $Values.Replace('$','\$') $Values = $Values.Replace("`r`n",'(ReturnChar)') $Values = $Values.Replace("`t",'(TabChar)') } # Join value fields $Line = "| $($Values -join " | ") |`n" # Add to results $Results += $Line } } Return $Results } #endregion END Block } |