POWERSHELL基于ConvertTo-Htm指定单元格效果css风格html报表
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,基于ConvertTo-Htm的css风格和指定单元格效果html报表的生成PowerShell本身具有一个简单但是很实用的命令 ConvertTo-Htm,可以把整个对象转换成HTML格式。事实上,
千家信息网最后更新 2025年12月01日POWERSHELL基于ConvertTo-Htm指定单元格效果css风格html报表
基于ConvertTo-Htm的css风格和指定单元格效果html报表的生成
PowerShell本身具有一个简单但是很实用的命令 ConvertTo-Htm,可以把整个对象转换成HTML格式。事实上,作为基本的功能他已经可以实现一些漂亮的界面了。但是还是太基础了,不能满足大多数用户的需要。
一方面,Html风格能否为美轮美奂css。还有,如何指定具体某一个单元格的效果呢,让用户体验更好呢。比如说,希望把Item5列所为ERR内容的都标示红色。
网上有这类函数,但不巧的是要收费,不提供源代码。我在ConvertTo-Htm基础上,经过改造实现了上述设想。现提供源代码供大家参考。

源代码如下:
Function Set-CellColor{ <# .SYNOPSIS Function that allows you toset individual cell colors in an HTML table .DESCRIPTION To be used inconjunctionwith ConvertTo-HTML this simple function allows you to set particular colors forcells in an HTML table. You provide thecriteria the script uses to make thedetermination if a cell should be a particular color (property -gt 5,property -like "*Apple*", etc). You can add the function toyour scripts, dot source it to load into your current PowerShell session or add itto your $Profile so it is always available. To dot source: .".\Set-CellColor.ps1" .PARAMETER Property Property, or column that youwill be keying on. .PARAMETER Color Name or 6-digit hex value ofthe color you want the cell to be .PARAMETER InputObject HTML you want the script toprocess. This can be entered directlyinto the parameter or piped to thefunction. .PARAMETER Filter Specifies a query todetermine if a cell should have its color changed. $true results will make the colorchange while $false result will return nothing. Syntax ::= thesame as $Property. This must matchexactly ::="-eq" | "-le" | "-ge" | "-ne" |"-lt" | "-gt"| "-approx" | "-like" |"-notlike" ::="-and" | "-or" ::="-not" The script first attempts to convert thecell to a number, and if it fails it will cast it as a string. So 40 will be a number and you can use -lt,-gt, etc. But 40% would be cast as a string soyou could only use -eq, -ne, -like, etc. .PARAMETER Row Instructs the script tochange the entire row to the specified color instead of the individual cell. .INPUTS HTML with table .OUTPUTS HTML .EXAMPLE get-process | convertto-html| set-cellcolor -Propety cpu -Color red -Filter "cpu -gt 1000" |out-file c:\test\get-process.html Assuming Set-CellColor hasbeen dot sourced, run Get-Process and convert to HTML. Then change the CPU cell tored only if the CPU field is greater than 1000. .EXAMPLE get-process | convertto-html| set-cellcolor cpu red -filter "cpu -gt 1000 -and cpu -lt 2000" |out-file c:\test\get-process.html Same as Example 1, but nowwe will only turn a cell red if CPU is greater than 100 but less than 2000. .EXAMPLE $HTML = $Data | sort server| ConvertTo-html -head $header | Set-CellColor cookedvalue red -Filter"cookedvalue -gt 1" PS C:\> $HTML = $HTML |Set-CellColor Server green -Filter "server -eq 'dc2'" PS C:\> $HTML |Set-CellColor Path Yellow -Filter "Path -like""*memory*""" | Out-File c:\Test\colortest.html Takes a collection ofobjects in $Data, sorts on the property Server and converts to HTML. From there we set the"CookedValue" property to red if it's greater then 1. We then send the HTML through Set-CellColor again, this time setting theServer cell to green if it's "dc2". One more time through Set-CellColor turns the Path cell toYellow if it contains the word "memory" in it. .EXAMPLE $HTML = $Data | sort server| ConvertTo-html -head $header | Set-CellColor cookedvalue red -Filter"cookedvalue -gt 1" -Row Now, if the cookedvalueproperty is greater than 1 the function will highlight the entire row red. .NOTES Author: Martin Pugh Twitter: @thesurlyadm1n Spiceworks: Martin9700 Blog: www.thesurlyadmin.com Changelog: 1.5 Added ability to set row colorwith -Row switch instead of the individual cell 1.03 Added error message in case the$Property field cannot be found in the table header 1.02 Added some additional text tohelp. Added some error trapping around$Filter creation. 1.01 Added verbose output 1.0 Initial Release .LINK http://community.spiceworks.com/scripts/show/2450-change-cell-color-in-html-table-with-powershell-set-cellcolor #> [CmdletBinding()] Param ( [Parameter(Mandatory,Position=0)] [string]$Property, [Parameter(Mandatory,Position=1)] [string]$Color, [Parameter(Mandatory,ValueFromPipeline)] [Object[]]$InputObject, [Parameter(Mandatory)] [string]$Filter, [switch]$Row ) Begin { Write-Verbose"$(Get-Date): Function Set-CellColor begins" If ($Filter) { If($Filter.ToUpper().IndexOf($Property.ToUpper()) -ge 0) { $Filter =$Filter.ToUpper().Replace($Property.ToUpper(),"`$Value") Try { [scriptblock]$Filter = [scriptblock]::Create($Filter) } Catch { Write-Warning"$(Get-Date): ""$Filter"" caused an error, stoppingscript!" Write-Warning$Error[0] Exit } } Else { Write-Warning "Could not locate$Property in the Filter, which is required. Filter: $Filter" Exit } } } Process { ForEach ($Line in$InputObject) { If($Line.IndexOf("(.*?)<\/th>'-AllMatches $Index = 0 ForEach ($Match in$Search.Matches) { If ($Match.Groups[1].Value -eq $Property) { Break } $Index ++ } If ($Index -eq$Search.Matches.Count) { Write-Warning "$(Get-Date): Unable tolocate property: $Property in table header" Exit } Write-Verbose"$(Get-Date): $Property column found at index: $Index" } If ($Line -match" (.*?)<\/td>' -AllMatches $Value =$Search.Matches[$Index].Groups[1].Value -as [double] If (-not $Value) { $Value =$Search.Matches[$Index].Groups[1].Value } If (Invoke-Command$Filter) { If ($Row) { Write-Verbose "$(Get-Date): Criteriamet! Changing row to $Color..." If ($Line-match "") { $Line = $Line -replace "","") } } Else { Write-Verbose "$(Get-Date): Criteriamet! Changing cell to $Color..." $Line =$Line.Replace($Search.Matches[$Index].Value,"$Value") } } } Write-Output $Line } } End { Write-Verbose"$(Get-Date): Function Set-CellColor completed" }} function filestring-search($inputFile,$matchstring,$matchcount){ $tmpcontent = Get-Content$inputFile for($i=0;$i -le$tmpcontent.length;i++) { if($tmpcontent[$i] -like'*Err*'){ $matchcount++ wite-host matchcount:$matchcount -background red } } return} Function ConvertTo-AdvHTML{ <# .SYNOPSIS Advanced replacement ofConvertTo-HTML cmdlet .DESCRIPTION This function allows forvastly greater control over cells and rows in a HTML table. It takes ConvertTo-HTML to a whole newlevel! You can now specify what color acell or row is (either dirctly or through the use of CSS). You can add links, pictures and pictures ASlinks. You can also specify a cellto be a bar graph where you control the colors of the graph and textthat can be included in the graph. All color functions arethrough the use of imbedded text tags inside the properties of the object youpass to this function. It is importantto note that this function does notdo any processing for you, you must make sure all control tags are alreadypresent in the object before passing it to the function. Here are the different tagsavailable: Syntax Comment =================================================================================== [cell:] Designate the color of the cell. Must be at the beginning of the string. Example: [cell:red]System Down [row:] Designate the color of therow. This control can be anywhere, in any property of the object. Example: [row:orchid] [cellclass:] Designate the color, and other properties, of the cell based on a class in your CSS. You must have the class in your CSS (use the -CSS parameter). Must be at the beginning of the string. Example: [cellclass:highlight]10mb [rowclass:] Designate the color, and other properties, of the row based on a class in your CSS. You must have the class in your CSS (use the -CSS parameter). This control can be anywhere, in any property of the object. Example: [rowclass:greyishbold] [p_w_picpath:] Include an p_w_picpath in your cell. Put size of picture in pixels and url seperated by semi-colons. Format must beheight;width;url. You can also includeother text in the cell, but the [p_w_picpath] tag must be at the end of the tag (so the alternate text is last). Example: [p_w_picpath:100;200;http://www.sampleurl.com/samplep_w_picpath.jpg]Alt Text ForImage [link:] Include a link in yourcell. Other text is allowed in the string, but the [link] tag must be at the end of the string. Example: blah blah blah [link:www.thesurlyadmin.com]Cool PowerShell Link [linkpic:] This tag uses a picture which you can click on and go to the specified link. You must specifythe size of the picture and url where it is located, this information is seperated by semi- colons. Other text is allowed inthe string, but the [link] tag must be at the end of the string. Example: [linkpic:100;200;http://www.sampleurl.com/samplep_w_picpath.jpg]www.thesurlyadmin.com [bar:] Bar graph makes a simple colored bar graph within the cell. The length of the bar is controlled using . You can designate the color of the bar, and the color of the remainder section. Due to the mysteries ofHTML, you must designate a width for the column with the [bar] tag using the HeadWidth parameter. So if you had a percentage of 95, say 95% used disk you would want to highlight the remainder for your report: Example: [bar:95;darkgreen;red]5% free What if you were at 30% of a sales goal with only 2 weeks left in the quarter, you would want to highlight that you have a problem. Example: [bar:30;darkred;red]30% of goal .PARAMETER InputObject The object you wantconverted to an HTML table .PARAMETER HeadWidth You can specify the width ofa cell. Cell widths are in pixels and are passed to theparameter in array format. Each element in the array corresponds tothe column in your table, any element that is set to 0 willdesignate the column with be dynamic. Ifyou had four elements in yourInputObject and wanted to make the 4th a fixed width--this is required forusing the [bar] tag--of 600 pixels: -HeadWidth 0,0,0,600 .PARAMETER CSS Designate custom CSS foryour HTML .PARAMETER Title Specifies a title for theHTML file, that is, the text that appears between the tags. .PARAMETER PreContent Specifies text to add beforethe opening tag. By default, there is no text in that position. .PARAMETER PostContent Specifies text to add afterthe closing
tag. By default, there is no text in that position. .PARAMETER Body Specifies the text to addafter the opening tag. By default, there is no text in thatposition. .PARAMETER Fragment Generates only an HTMLtable. The HTML, HEAD, TITLE, and BODY tags are omitted. .INPUTS System.Management.Automation.PSObject You can pipe any .NET objectto ConvertTo-AdvHtml. .OUTPUTS System.String ConvertTo-AdvHtml returnsseries of strings that comprise valid HTML. .EXAMPLE $Data = @"Server,Description,Status,Disk[row:orchid]Server1,Hello1,[cellclass:up]Up,"[bar:45;Purple;Orchid]55%Free"Server2,Hello2,[cell:green]Up,"[bar:65;DarkGreen;Green]65% Used"Server3,Goodbye3,[cell:red]Down,"[bar:95;DarkGreen;DarkRed]5%Free"server4,This is quite a cooltest,[cell:green]Up,"[p_w_picpath:150;650;http://pughspace.files.wordpress.com/2014/01/test-connection.png]TestImages"server5,SurlyAdmin,[cell:red]Down,"[link:http://thesurlyadmin.com]TheSurly Admin"server6,MoreSurlyAdmin,[cell:purple]Updating,"[linkpic:150;650;http://pughspace.files.wordpress.com/2014/01/test-connection.png]http://thesurlyadmin.com""@ $Data = $Data |ConvertFrom-Csv $HTML = $Data |ConvertTo-AdvHTML -HeadWidth 0,0,0,600 -PreContent"This might be the best reportEVER
" -PostContent "
Done!$(Get-Date)" -Title "Cool Test!" This is some sample codewhere I try to put every possibile tag and use into a single set of data. $Data is the PSObject 4 columns. Default CSS is used, so the [cellclass:up]tag will not work but I left itthere so you can see how to use it. .NOTES Author: Martin Pugh Twitter: @thesurlyadm1n Spiceworks: Martin9700 Blog: www.thesurlyadmin.com Changelog: 1.0 Initial Release .LINK http://thesurlyadmin.com/convertto-advhtml-help/ .LINK http://community.spiceworks.com/scripts/show/2448-create-advanced-html-tables-in-powershell-convertto-advhtml #> #requires -Version 2.0 [CmdletBinding()] Param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [Object[]]$InputObject, [string[]]$HeadWidth, [string]$CSS = @""@, [string]$Title, [string]$PreContent, [string]$PostContent, [string]$Body, [switch]$Fragment ) Begin { If ($Title) { $CSS += "`n$Title `n" } $Params = @{ Head = $CSS } If ($PreContent) { $Params.Add("PreContent",$PreContent) } If ($PostContent) { $Params.Add("PostContent",$PostContent) } If ($Body) { $Params.Add("Body",$Body) } If ($Fragment) { $Params.Add("Fragment",$true) } $Data = @() } Process { ForEach ($Line in $InputObject) { $Data += $Line } } End { $Html = $Data |ConvertTo-Html @Params |Set-CellColor item5 red -Filter "item5 -eq'ERR'" $NewHTML = @() ForEach ($Line in $Html) { If ($Line -like "**") { If ($Headwidth) { $Index = 0 $Reg = $Line |Select-String -AllMatches -Pattern " (.*?)<\/th>" ForEach ($th in$Reg.Matches) { If ($Index -le ($HeadWidth.Count - 1)) { If ($HeadWidth[$Index] -and$HeadWidth[$Index] -gt 0) { $Line = $Line.Replace($th.Value,"$($th.Groups[1]) ") } } $Index ++ } } } Do { Switch -regex($Line) { "\[cell:(.*?)\].*?<\/td>" { $Line =$Line.Replace(" [cell:$($Matches[1])]","") Break } "\[cellclass:(.*?)\]" { $Line =$Line.Replace("[cellclass:$($Matches[1])]","") Break } "\[row:(.*?)\]" { $Line =$Line.Replace(""," ") $Line =$Line.Replace("[row:$($Matches[1])]","") Break } "\[rowclass:(.*?)\]" { $Line =$Line.Replace(" ","") $Line =$Line.Replace("[rowclass:$($Matches[1])]","") Break } "\[bar:(.*?)\](.*?)<\/td>" { $Bar = $Matches[1].Split(";") $Width = 100- [int]$Bar[0] If (-not$Matches[2]) { $Text = " " } Else { $Text = $Matches[2] } $Line =$Line.Replace($Matches[0]," $Text ") Break } "\[p_w_picpath:(.*?)\](.*?)<\/td>" { $Image = $Matches[1].Split(";") $Line =$Line.Replace($Matches[0],"") } "\[link:(.*?)\](.*?)<\/td>" { $Line =$Line.Replace($Matches[0],"$($Matches[2])") } "\[linkpic:(.*?)\](.*?)<\/td>" { $Images = $Matches[1].Split(";") $Line =$Line.Replace($Matches[0],"") } Default { Break } } } Until ($Line -notmatch"\[.*?\]") $NewHTML += $Line } Return $NewHTML }} $today = Get-Date -UFormat "%Y%m%d"$LogFilePath = "C:\DayCheck\ftpLog_$today.txt" $today = Get-Date -UFormat "%Y%m%d"$TargetFileTxt= "C:\DayCheck\CheckResultALL.txt"$TargetFileHtml= "C:\DayCheck\CheckResultALL.html" if( Test-Path $TargetFileTxt ){ write-host "$TargetFileTxt exist remove" remove-item$TargetFileTxt -Force}else { write-host"create $TargetFileTxt " New-Item -Path$TargetFileTxt -Type file } remove-item C:\DayCheck\ResultOut.txt -Forceremove-item C:\DayCheck\CheckResult* -Force New-Item -Path C:\DayCheck\*_result.txt -TypefileNew-Item -Path C:\DayCheck\CheckResultSummaryALL.txt -Type fileNew-Item -Path C:\DayCheck\ResultOut.txt -TypefileNew-Item -Path C:\DayCheck\C:\DayCheck\CheckResultALL.txt -Type file $UserName = "daycheck"$Password = "daycheck" "item1,item2,item3,item4,item5,item6"| Out-File -Encoding utf8 C:\DayCheck\CheckResultSummaryALL.csv Import-Csv 'C:\DayCheck\MachineList.csv' |ForEach-Object{ $OS = $_.OS $APP = $_.APP $IP = $_.IP $NAME = $_.NAME $RemoteFilename = "ftp://xx.xx.20.240/"+ $OS + "_"+ $NAME + "_all_"+ "20160722" +"07_" + "result.txt" $RemoteFilename $filename = "C:\DayCheck\" + $OS +"_"+ $NAME + "_all_"+"20160722" + "07_"+ "result.txt" if ( Test-Path -Path $filename ) { write-host "search file $filenamebegining " $tmpcontent=Get-Content$filename | Where-Object { $_ -like '*Err*' } $matchcount=0 foreach($element in$tmpcontent){ $matchcount++ #write-host"element $element " } write-host "search fileErr : $matchcount " -background red if($matchcount -eq 1 ) { "$APP,$NAME$IP,$OS,download,O K,$herffilename" | Out-File -Encoding utf8 -Append C:\DayCheck\CheckResultSummaryALL.csv }else{ "$APP,$NAME$IP,$OS,download,ERR,$herffilename" | Out-File -Encoding utf8 -Append C:\DayCheck\CheckResultSummaryALL.csv } } else{ "$APP,$NAME($IP),$OS,N/A,N/A,N/A" | Out-File -Encoding utf8 -Append C:\DayCheck\CheckResultSummaryALL.csv } } C:\DayCheck\*_result.txt>>C:\DayCheck\CheckResultTotalALL.txt import-csv C:\DayCheck\CheckResultSummaryALL.csv | ConvertTo-AdvHTML -HeadWidth 0,0,0,0,0,0-PreContent "This might be the best reportEVER
" -PostContent "
Done!$(Get-Date)" -Title "Cool Test!" | Set-Content "C:\DayCheck\CheckResultSummaryALL.html" invoke-item C:\DayCheck\CheckResultSummaryALL.html
源代码
单元
效果
风格
基础
用户
报表
实用
漂亮
美轮美奂
一方
事实
事实上
内容
函数
功能
命令
对象
格式
比如说
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
金融业网络安全监督管理部门
生存战怎么加服务器手机版
比亚迪思锐硬盘数据库
云数据库怎么保障安全
深圳市蓝思网络技术厂
软件开发理论
如何打开服务器数据库中的表
计算机三级数据库技术模拟题
在数据库中C是什么型
网络技术是啥意思
票据授权服务器是什么的一部分
贝宝中国服务器网
数据库有哪些安全性机制
上海迈高网络技术有限公司咋样
俞海数据库
云服务器可以玩奇迹mu吗
plc上位软件开发
产业界对网络安全的认识
云服务器搭建app后台
书同文古籍数据库
核电厂辐照监督数据库
上海软件开发人力报价
交通运输有哪些数据库系统
陕西省网络安全协会029
网络技术对人们生活的影响
网络安全体系结构内容
网络安全工程师学习流程
数据库技术与应用的需求分析笔记
无法访问远程服务器地址
十年软件开发想转测试
相关文章