Private/ConvertTo-HTMLTableFromArray.ps1

<#
.SYNOPSIS
    This function attempts to parse a string into a DateTime object using a set of known formats.
  
.DESCRIPTION
    #************************************************************************************************************
    # Disclaimer
    #
    # This sample script is not supported under any Microsoft standard support program or service. This sample
    # script is provided AS IS without warranty of any kind. Microsoft further disclaims all implied warranties
    # including, without limitation, any implied warranties of merchantability or of fitness for a particular
    # purpose. The entire risk arising out of the use or performance of this sample script and documentation
    # remains with you. In no event shall Microsoft, its authors, or anyone else involved in the creation,
    # production, or delivery of this script be liable for any damages whatsoever (including, without limitation,
    # damages for loss of business profits, business interruption, loss of business information, or other
    # pecuniary loss) arising out of the use of or inability to use this sample script or documentation, even
    # if Microsoft has been advised of the possibility of such damages.
    #
    #************************************************************************************************************
 
#>

#region ConvertTo-HTMLTableFromArray
Function ConvertTo-HTMLTableFromArray 
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [array]$InputList,
        [Parameter(Mandatory = $false)]
        [string]$TableType 
    )


    $htmlOutput = ""

    for ($i = 0; $i -lt $InputList.Count; $i++) 
    {
        $item = $InputList[$i]
        $htmlOutput += "<table class='nested-table'>"

        foreach ($prop in $item.PSObject.Properties) 
        {

            if ($TableType -eq 'ScriptBody' -and $prop.Name -eq 'ScriptBody') 
            {
                # If the property is ScriptBody, decode it and display it in a <pre> tag
                # This is to handle the case where the script body is base64 encoded
                # and we want to display it as text in the HTML report

                $htmlOutput += "<tr>"
                $htmlOutput += "<td colspan='2'>$($prop.Name)</td>"
                $htmlOutput += "</tr>"

                try 
                {
                    $htmlOutput += "<tr>"
                    $decodedBytes = [System.Convert]::FromBase64String($InputList.ScriptBody)
                    $decodedString = [System.Text.Encoding]::UTF8.GetString($decodedBytes)
                  
                    $htmlOutput += "<td colspan='2'>"
                    $htmlOutput += " <div class='script-container'>"
                    $htmlOutput += " <button class='toggle-button-inner-script' onclick='toggleScript(this)'>Hide</button>"
                    $htmlOutput += " <button class='toggle-button-inner-script' onclick='copyScript(this)'>Copy</button>"
                    $htmlOutput += " <pre class='script-body'>$decodedString</pre>"
                    $htmlOutput += " </div>"
                    $htmlOutput += "</td>"
                    $htmlOutput += "<tr>"
                } 
                catch 
                {
                    $htmlOutput += "<td>$(Invoke-EscapeHtmlText -Text ($prop.Value.ToString()))</td>"
                }                
            } 
            else 
            {
                $htmlOutput += "<tr>"
                $htmlOutput += "<td>$($prop.Name)</td>"

                if ($prop.Value -is [System.Management.Automation.PSObject] -or $prop.Value -is [hashtable]) 
                {
                    # Recursively call the same function for nested objects
                    $nestedHtml = ConvertTo-HTMLTableFromArray -InputList @($prop.Value)
                    $htmlOutput += "<td>$nestedHtml</td>"
                } 
                else 
                {
                    $htmlOutput += "<td>$($prop.Value)</td>"
                }

                $htmlOutput += "</tr>"
            }
        }

        $htmlOutput += "</table>"

        # Add <hr> only if this is not the last item
        if ($i -lt $InputList.Count - 1) 
        {
            $htmlOutput += "<hr style='border: 0; border-top: 1px solid #ccc; margin: 20px 0;'>"
        }
    }

    return $htmlOutput
}
#endregion