<# .SYNOPSIS Takes input objects, and outputs a sortable HTML table .DESCRIPTION The function requires at least 2 parameters, an input object and a path where the result is to be output to. The function will output 3 files, a css file that determines the way the result is formatted, a javascript file that handles the sorting, and a HTML file that contains the data. .PARAMETER $InputObject Contains the objects that should go into the table. (required) .PARAMETER $OutputFolder The folder where the resulting files should be put, if the folder does not exist it will be created. (required) .PARAMETER $BrowserTitle The name that will show up in the browser title line .PARAMETER $ReportTitle The name of the report on the HTML page .EXAMPLE PS C:\> Out-HTMLTable -$InputObject (Get-process | select Name,Handles) -$OutputFolder c:\Reports .EXAMPLE PS C:\> (Get-process | select Name,Handles) | Out-HTMLTable -$OutputFolder c:\Reports -$BrowserTitle "Very Important Report" .INPUTS Powershell objects .OUTPUTS HTMLTable .NOTES Additional information about the function go here. .LINK about_functions_advanced .LINK about_comment_based_help #> Function Out-HTMLTable { [CmdletBinding()] param( [Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)] $InputObject, [Parameter(Mandatory=$true,Position=1)] $OutPutFolder, [Parameter(Mandatory=$false)] $BrowserTitle = "Table Report", [Parameter(Mandatory=$false)] $ReportTitle = "Data" ) begin { [Object[]]$Objects = @() If (!($OutPutFolder.EndsWith("\"))) {$OutPutFolder = $OutPutFolder +"\"} if (!(Test-Path -path $OutputFolder)) { New-Item $OutputFolder -type directory } } process { $Objects += $InputObject } end { $Note = "Number of objects: " + [String](($Objects).Count) $Objects | ConvertTo-Html –body "

$Title

" -Head "$($BrowserTitle)" | ForEach-Object {$_.replace("<","<").replace(">",">").replace("","").replace("","","").replace("
").replace("
","")} | Out-File -Encoding ASCII -FilePath ($OutPutFolder + "\table.html") -Force #*############################# #* Output Style Sheet to file # #*############################# $css = @' /* Copyright 2006 Joost de Valk */ a img { border: 0; } table.sortable { border-spacing: 0; border: 1px solid #000; border-collapse: collapse; } table.sortable th, table.sortable td { text-align: left; padding: 2px 4px 2px 4px; width: 125px; border-style: solid; border-color: #444; } table.sortable th { border-width: 0px 1px 1px 1px; background-color: #ccc; } table.sortable td { border-width: 0px 1px 0px 1px; } table.sortable tr.odd td { background-color: #ddd; } table.sortable tr.even td { background-color: #fff; } table.sortable tr.sortbottom td { border-top: 1px solid #444; background-color: #ccc; font-weight: bold; } '@ $css | Out-File -encoding ASCII -FilePath ($OutPutFolder + "Style.css") -Force #*############################# #* Output Style Sheet to file # #*############################# $sorttable= @' /* Table sorting script by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/. Based on a script from http://www.kryogenix.org/code/browser/sorttable/. Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html . Copyright (c) 1997-2007 Stuart Langridge, Joost de Valk. Version 1.5.7 */ /* You can change these values */ var image_path = "http://www.joostdevalk.nl/code/sortable-table/"; var image_up = "arrowup.gif"; var image_down = "arrowdown.gif"; var image_none = "arrownone.gif"; var europeandate = true; var alternate_row_colors = true; /* Don't change anything below this unless you know what you're doing */ addEvent(window, "load", sortables_init); var SORT_COLUMN_INDEX; var thead = false; function sortables_init() { // Find all tables with class sortable and make them sortable if (!document.getElementsByTagName) return; tbls = document.getElementsByTagName("table"); for (ti=0;ti 0) { if (t.tHead && t.tHead.rows.length > 0) { var firstRow = t.tHead.rows[t.tHead.rows.length-1]; thead = true; } else { var firstRow = t.rows[0]; } } if (!firstRow) return; // We have a first row: assume it's the header, and make its contents clickable links for (var i=0;i'+txt+'  ↓'; } } if (alternate_row_colors) { alternate(t); } } function ts_getInnerText(el) { if (typeof el == "string") return el; if (typeof el == "undefined") { return el }; if (el.innerText) return el.innerText; //Not needed but it is faster var str = ""; var cs = el.childNodes; var l = cs.length; for (var i = 0; i < l; i++) { switch (cs[i].nodeType) { case 1: //ELEMENT_NODE str += ts_getInnerText(cs[i]); break; case 3: //TEXT_NODE str += cs[i].nodeValue; break; } } return str; } function ts_resortTable(lnk, clid) { var span; for (var ci=0;ci'; newRows.reverse(); span.setAttribute('sortdir','up'); } else { ARROW = '  ↑'; span.setAttribute('sortdir','down'); } // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones // don't do sortbottom rows for (i=0; i'; } } } span.innerHTML = ARROW; alternate(t); } function getParent(el, pTagName) { if (el == null) { return null; } else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) { return el; } else { return getParent(el.parentNode, pTagName); } } function sort_date(date) { // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX dt = "00000000"; if (date.length == 11) { mtstr = date.substr(3,3); mtstr = mtstr.toLowerCase(); switch(mtstr) { case "jan": var mt = "01"; break; case "feb": var mt = "02"; break; case "mar": var mt = "03"; break; case "apr": var mt = "04"; break; case "may": var mt = "05"; break; case "jun": var mt = "06"; break; case "jul": var mt = "07"; break; case "aug": var mt = "08"; break; case "sep": var mt = "09"; break; case "oct": var mt = "10"; break; case "nov": var mt = "11"; break; case "dec": var mt = "12"; break; // default: var mt = "00"; } dt = date.substr(7,4)+mt+date.substr(0,2); return dt; } else if (date.length == 10) { if (europeandate == false) { dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2); return dt; } else { dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2); return dt; } } else if (date.length == 8) { yr = date.substr(6,2); if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; } if (europeandate == true) { dt = yr+date.substr(3,2)+date.substr(0,2); return dt; } else { dt = yr+date.substr(0,2)+date.substr(3,2); return dt; } } return dt; } function ts_sort_date(a,b) { dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX])); dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); if (dt1==dt2) { return 0; } if (dt1