Home > Enterprise >  PowerShell: Change cell color in HTML table based on value or IF statements
PowerShell: Change cell color in HTML table based on value or IF statements

Time:09-17

Evening guys. I've got a function I've been working on as part of a script I've got that creates a nested hashtable of software information and creates an HTML table. I've got the table working and I like how it is, but I'd like to have a cell (or maybe just the text colors in certain cells) change color based on if certain values match.

My thoughts are either a Status column and having the background color change, or have the text in Installed Version & Expected Version columns change color.I don't know if it's possible with how I'm compiling the table, and it isn't a end of the world thing if it won't work, more of a "be cool if it could" kind of thing.

My Overall Question is: How can I change the background color of a cell in the "Status" column based on if two certain values match. Or alternatively have the text color change in a cell for the "Installer Version" and "Expected Versions" columns. Below is my function

Note: I am extremely new to HTML/CSS languages. This is what I've been able to put together with a lot of googling and reading.

Function Get-SoftwareVersions{
<#
.DESCRIPTION
Function used to gather the software application version information in the section above.
Collects the information from the InstallerVersion and ExeVersion properties and reports them into a HTML table.
#>
$AdminTools = [ordered]@{
    "Notepad" = [PSCustomObject]@{
        Application = "Notepad  "
        "Installed Version" = $Notepad.ExeVersion
        "Expected Version" = $Notepad.InstallerVersion
        "Status" = ""
    }
    "PowerShell7" = [PSCustomObject]@{
        Application = "PowerShell 7"
        "Installed Version" = $PowerShell7.ExeVersion
        "Expected Version" = $PowerShell7.InstallerVersion
        "Status" = ""
    }
    "PuTTY" = [PSCustomObject]@{
        Application = "PuTTY"
        "Installed Version" = $Putty.ExeVersion
        "Expected Version" = $Putty.InstallerVersion
        "Status" = ""
    }
    "MTPuTTY" = [PSCustomObject]@{
        Application = "MTPuTTY"
        "Installed Version" = $Putty.MTPuttyVersion
        "Expected Version" = $Putty.MTPuttyVersion
        "Status" = ""
    }
    "Rufus" = [PSCustomObject]@{
        Application = "Rufus"
        "Installed Version" = $Rufus.ExeVersion
        "Expected Version" = $Rufus.ExeVersion
    }
    "TFTP Server" = [PSCustomObject]@{
        Application = "TFTP Server"
        "Installed Version" = $TFTP.ExeVersion
        "Expected Version" = $TFTP.InstallerVersion
    }
    "VLC Media Player" = [PSCustomObject]@{
        Application = "VLC Media Player"
        "Installed Version" = $VLC.ExeVersion
        "Expected Version" = $VLC.InstallerVersion
    }
    "WinMerge" = [PSCustomObject]@{
        Application = "WinMerge"
        "Installed Version" = $WinMerge.ExeVersion
        "Expected Version" = $WinMerge.InstallerVersion
    }
    "WinSCP" = [PSCustomObject]@{
        Application = "WinSCP"
        "Installed Version" = $WinSCP.ExeVersion
        "Expected Version" = $WinSCP.InstallerVersion
    }
    "WireShark" = [PSCustomObject]@{
        Application = "WireShark"
        "Installed Version" = $WireShark.ExeVersion
        "Expected Version" = $WireShark.InstallerVersion
    }
    "NPCap" = [PSCustomObject]@{
        Application = "NPCap"
        "Installed Version" = $NPCap.ExeVersion
        "Expected Version" = $NPCap.InstallerVersion
    }
}
$Browsers = [ordered]@{
    "Microsoft Edge" = [PSCustomObject]@{
        Application = "Microsoft Edge"
        "Installed Version" = $MSEdge.ExeVersion
        "Expected Version" = $MSEdge.InstallerVersion
        "Status" = ""
    }
}
$VMWare = [ordered]@{

    "OVFTool" = [PSCustomObject]@{
        Application = "OVFTool"
        "Installed Version" = $OVFTool.ExeVersion
        "Expected Version" = $OVFTool.InstallerVersion
    }
    "PowerCLI" = [PSCustomObject]@{
        Application = "PowerCLI PowerShell Module"
        "Installed Version" = $PowerCLI.ModuleVersion
        "Expected Version" = $PowerCLI.InstallerVersion
    }
    "VMware Workstation" = [PSCustomObject]@{
        Application = "VMware Workstation"
        "Installed Version" = $Workstation.ExeVersion
        "Expected Version" = $Workstation.InstallerVersion
    }
    "VMRC" = [PSCustomObject]@{
        Application = "VMware Remote Console"
        "Installed Version" = $VMRC.ExeVersion
        "Expected Version" = $VMRC.InstallerVersion
    }
}
$Satcom = [ordered]@{
    "Airbus M&C" = [PSCustomObject]@{
        Application = "Airbus Monitor & Control"
        "Installed Version" = $AirbusMC.ExeVersion
        "Expected Version" = $AirbusMC.InstallerVersion
    }
    "Airbus KA-Band SSPB Software" = [PSCustomObject]@{
        Application = "Mission Microwave UserGUI"
        "Installed Version" = $AirbusKA.InstallerVersion
        "Expected Version" = $AirbusKA.InstallerVersion
    }
    "Airbus Spec Any" = [PSCustomObject]@{
        Application = "EVO Spectrum Analyzer"
        "Installed Version" = $AirbusSpecAny.InstallerVersion
        "Expected Version" = $AirbusSpecAny.InstallerVersion
    }
    "Wavestream" = [PSCustomObject]@{
        Application = "Wavestream UserGUI"
        "Installed Version" = $Wavestream.InstallerVersion
        "Expected Version" = $Wavestream.InstallerVersion
    }

}
$SDCApps = [ordered]@{
    "NetBanner" = [PSCustomObject]@{
        Application = "NetBanner"
        "Installed Version" = $NetBanner.ExeVersion
        "Expected Version" = $NetBanner.InstallerVersion
    }
    "Axway" = [PSCustomObject]@{
        Application = "Axway"
        "Installed Version" = $Axway.ExeVersion
        "Expected Version" = $Axway.InstallerVersion
    }
    "ActivClient" = [PSCustomObject]@{
        Application = "ActivClient"
        "Installed Version" = $ActivClient.ExeVersion
        "Expected Version" = $ActivClient.InstallerVersion
    }
    "90Meter" = [PSCustomObject]@{
        Application = "90Meter"
        "Installed Version" = $90Meter.ExeVersion
        "Expected Version" = $90Meter.InstallerVersion
    }
    "Titus Classification" = [PSCustomObject]@{
        Application = "Titus Classification"
        "Installed Version" = $Titus.ExeVersion
        "Expected Version" = $Titus.InstallerVersion
    }
}


Switch ($Enclave){
    NIPR {
        $SDCApps.Remove("90Meter")
        $SDCApps.Remove("Titus Classification")
        $PreContentHeader = "<h2>TDC Management Laptop Application Baseline Versioning Table - <span style='color:green'>NIPR</span></h2> 
        <h3>Report Run: <span style='color:red'>$(Get-Date)</span> by <span style='color:red'>$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)</span></h3>"
    }

    SIPR {
        $SDCApps.Remove("ActivClient")
        $PreContentHeader = "<h2>TDC Management Laptop Application Baseline Versioning Table - <span style='color:red'>SIPR</span></h2> <h3><p id='ReportDate'>Report Run: $(Get-Date) by $([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)</h3>"
    }
}

$Header = @'
<style>
    body {
        background-color: Gainsboro;
        font-family:      "Calibri";
    }

    table {
        border-width:     1px;
        border-style:     solid;
        border-color:     black;
        border-collapse:  collapse;
        width:            75%;
    }

    col {
        width: 20%;
    }

    th {
        border-width:     1px;
        padding:          5px;
        border-style:     solid;
        border-color:     black;
        background-color: #98C6F3;
    }

    td {
        border-width:     1px;
        padding:          5px;
        border-style:     solid;
        border-color:     black;
        background-color: White;
    }

    td[value="wrong"]{
        background-color: #ff0000;
    }

    tr {
        text-align: left;
        background-color: #00ff00;
    }
   
</style>
'@


$Title = "<h1>TDC Management Laptop Application Baseline Versioning Table - <span style='color:green'>NIPR</span></h1>
<h3>Report Run: <span style='color:red'>$(Get-Date)</span> by <span style='color:red'>$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)</span></h3>"

$Admin = $Admintools.Values | ConvertTo-Html -Fragment -precontent "<h3>Administrator Tools</h3>"
$Browser = $Browsers.Values | ConvertTo-Html -Fragment -PreContent "<h3>Web Browsers</h3>"
$VMWareApps = $VMWare.Values | ConvertTo-Html -Fragment -PreContent "<h3>VMware Applications</h3>"
$SatcomApps = $Satcom.Values | ConvertTo-Html -Fragment -PreContent "<h3>SATCOM Applications</h3>"
$SDC = $SDCApps.Values | ConvertTo-Html -Fragment -PreContent "<h3>SDC Applications</h3>"




ConvertTo-Html -Body "$Title $Admin $Browser $VmWareApps $SatcomApps $SDC" -Head $Header | Out-File "C:\Source\BuildSource\Laptop\Application_Verification.html"



Invoke-Item "C:\Source\BuildSource\Laptop\Application_Verification.html"

}

CodePudding user response:

There is no way to reproduce your code without having all variables defined beforehand hence I'll use below example object to demonstrate how this can be done.

$adminTools = @(
    [ordered]@{
        "Application"       = "PowerShell 7"
        "Installed Version" = [version] '5.1'
        "Expected Version"  = [version] '7.2.6'
    }
    [ordered]@{
        "Application"       = "PuTTY"
        "Installed Version" = [version] '0.77'
        "Expected Version"  = [version] '0.77'
    }
)

I have added these 2 classes to your current CSS:

.bad {
  background-color: #ffc7ce;
  color: #9c0006;
  font-weight: bold;
}

.good {
  background-color: #c6efce;
  color: #006100;
  font-weight: bold;
}

First part is adding the status column based on the condition if Installed Version is lower than Expected Version:

$export = foreach($item in $adminTools) {
    $item['Status'] = 'Up to Date'
    if($item['Installed Version'] -lt $item['Expected Version']) {
        $item['Status'] = 'Needs Update'
    }
    [pscustomobject] $item
}

Now we can use Regex.Replace(String, String, MatchEvaluator) combined with a hashtable that we can use to replace the <td> tag for the the <td> tags with the clases depending on the matched value in the capturing group:

$map = @{
    'Up to Date'   = '<td >'
    'Needs Update' = '<td >'
}

$html = $export | ConvertTo-Html -PreContent $style -Head '<h1>Hello world</h1>'
[regex]::Replace($html, '(?i)<td>(Needs Update|Up to Date)', {
    param($s)
    $map[$s.Groups[1].Value]   $s.Groups[1].Value
}) | Set-Content test.html

Invoke-Item test.html

Demo of how this would look using the example objects

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <h1>Hello world</h1>
  </head>
  <body>
    <style>
      body {
        background-color: Gainsboro;
        font-family: "Calibri";
      }

      table {
        border-width: 1px;
        border-style: solid;
        border-color: black;
        border-collapse: collapse;
        width: 75%;
      }

      col {
        width: 20%;
      }

      th {
        border-width: 1px;
        padding: 5px;
        border-style: solid;
        border-color: black;
        background-color: #98C6F3;
      }

      td {
        border-width: 1px;
        padding: 5px;
        border-style: solid;
        border-color: black;
        background-color: White;
      }

      .bad {
        background-color: #ffc7ce;
        color: #9c0006;
        font-weight: bold;
      }

      .good {
        background-color: #c6efce;
        color: #006100;
        font-weight: bold;
      }

      tr {
        text-align: left;
        background-color: #00ff00;
      }
    </style>
    <table>
      <colgroup>
        <col />
        <col />
        <col />
        <col />
      </colgroup>
      <tr>
        <th>Application</th>
        <th>Installed Version</th>
        <th>Expected Version</th>
        <th>Status</th>
      </tr>
      <tr>
        <td>PowerShell 7</td>
        <td>5.1</td>
        <td>7.2.6</td>
        <td >Needs Update</td>
      </tr>
      <tr>
        <td>PuTTY</td>
        <td>0.77</td>
        <td>0.77</td>
        <td >Up to Date</td>
      </tr>
    </table>
  </body>
</html>

  • Related