Powershell 创建炫丽美观的Html报表

我们通过PowerShell可以获取各种信息,如何保存这些获取的信息呢?最简单的方法是保存为csv或者是xml文件,这样可以轻松的导入导出。不过这两种文件在人眼的可读性上都不够美观。xml从程序的角度非常方便,但是看起来很不舒服;同样的,尽管csv文件可以通过Excel打开,但是最重要的一点,他没有颜色!对于很多习惯把Excel表格标注的五颜六色的人来说,csv的世界实在是太昏暗了。

那么直接保存为XLSX文件如何呢?传统的PowerShell对Office的支持很不好,只能通过ComObject来操作。但是微软官方直接告诉你这种方式有bug,很慢而且很不稳定。幸运的是,最新的PowerShell 5可以直接下载Excel的模块了,这是直接通过.Net的一个dll文件来调用的,迅速稳定,可以说是一个巨大的福音。有兴趣的可以从PowerShell Gallery下载使用。他可以直接生成报表甚至是图表。

这篇文章主要是关注第三种方式,把结果保存为HTML的网页格式。把PS对象转换成HTML对象并不是什么新东西,PS自带的ConvertTo-HTML命令就能做到,不过这个命令的性能不够强,只是泛泛的生成一个结果,并不能根据条件对一些特定的表格或者列表设定格式或者颜色,因此又有很多人开发了自己的高级函数。

首先来看一个很传统的笨方法。

比如说下面截取自某网友提供的片段

这种方法是通过一个一个的表格单元硬写成HTML的格式。首先这就违反了一个编写PowerShell function的基本原则,每一个function的输出对象应该有且只有一个,获取对象和输出对象的方式应该属于不同的function,很明显,上面的例子把获取对象和输出对象强行的拧在一个地方实现了,不仅混乱而且写的很难看。

PowerShell本身具有一个简单但是很实用的命令 ConvertTo-Htm,可以把整个对象转换成HTML格式。事实上,虽然很多人诟病他不够强大,作为基本的功能他已经可以实现一些漂亮的界面了。

比如说 我首先定义一个简单的style,然后执行一个function获取指定计算机的磁盘信息,转换成Html然后保存

[email protected]"
<style>
BODY{background-color:Lavender ;}
TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}
TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;b
ackground-color:thistle}
TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:PaleGoldenrod}</style>
"@
Get-DiskInfo -computername yli-ise | ConvertTo-Html -Body "<H1>DiskInfo</H1>" -Head $style | out-file C:\temp\disk.html
invoke-item c:\temp\disk.html

效果如下所示

这种方式可以通过指定head或者css文件生成美轮美奂的Html效果,不过很明显的缺点是,我无法指定具体某一个单元格的效果。这种默认的命令只能指定一个整体的表格的效果,那么怎么破呢?

第一个方式是直接修改现有的Html文件。

已经有人写了一个现成的function,下载之后直接调用就行了

https://community.spiceworks.com/scripts/show/2450-change-cell-color-in-html-table-with-powershell-set-cellcolor

比如说,我在上面的例子里面希望把剩余空间低于20G的都标红,那么可以做下面的简单修改即可

Get-DiskInfo -computername yli-ise | ConvertTo-Html -Body "<H1>DiskInfo</H1>" -Head $style |
Set-CellColor -Property FreeSpace -color red -filter "FreeSpace -lt 20" | out-file C:\temp\disk.html

效果如下

上面这种修改html文件的方式比较简单容易,另外还可以直接生成对应的html文件。这样的高级函数网上也有好几个版本,不过目前公认比较好的是 Jon David大神写的 ConvertTo-EnhancedHtmlFragment和ConvertTo-EnhancedHtml 两个高级function。ps5的话 这个模块可以直接下载安装。

https://www.powershellgallery.com/packages/EnhancedHTML2/2.0

Jon自己在powershell.org论坛上还专门出了一本免费的电子书来解释如何使用这两个函数。不过这个论坛最近改版弄得面目全非,很多文章不知道跑哪里去了。豆子之前下载过,大概花了1个半小时来看这本书电子书的案例和两个function的源代码,基本理解了怎么使用。 简单的说,自己先定义一个css以方便后面某个单元格或者行或者表列调用,然后通过ConvertTo-Enhancedhtmlfragment生成对应的HTML块,这个HTML块是自己根据各种条件定义颜色,类型等等定义hash表转换而成的HTML文件,每一个tag对应的效果其实是调用最开始在css中定义的class;最后所有的HTML块放一起,通过ConvertTo-EnhancedHtml 生成对应的HTML文件。建议耐心的通读一遍例子,然后在看看对应function的源代码,这样才能知道定义hash表的时候到底应该提供什么内容。

下面来个简单的例子。

我直接导入某用户信息列表,这个是我之前通过Get-ADUser获取的。然后我把senior(高级)职务的都标成绿色,Rapp部门的标成红色,转换成Html输出,奇偶行交错更改颜色

$style2 = @"
<style>
body {
    color:#333333;
    font-family:Calibri,Tahoma;
    font-size: 10pt;
}
h1 {
    text-align:center;
}
h2 {
    border-top:1px solid #666666;
}
th {
    font-weight:bold;
    color:#eeeeee;
    background-color:#333333;
    cursor:pointer;
}
.odd  { background-color:#ffffff; }
.even { background-color:#dddddd; }
.paginate_enabled_next, .paginate_enabled_previous {
    cursor:pointer; 
    border:1px solid #222222; 
    background-color:#dddddd; 
    padding:2px; 
    margin:4px;
    border-radius:2px;
}
.paginate_disabled_previous, .paginate_disabled_next {
    color:#666666; 
    cursor:pointer;
    background-color:#dddddd; 
    padding:2px; 
    margin:4px;
    border-radius:2px;
}
.dataTables_info { margin-bottom:4px; }
.sectionheader { cursor:pointer; }
.sectionheader:hover { color:red; }
.grid { width:100% }
.red {
    color:red;
    font-weight:bold;
} 
.green{
    color:green;
    font-weight:bold;
}
</style>
"@
$params = @{
                    ‘As‘=‘Table‘;
                    ‘PreContent‘=‘<h2>Users List</h2>‘;
                    ‘EvenRowCssClass‘=‘even‘;
                    ‘OddRowCssClass‘=‘odd‘
                    ‘TableCssClass‘=‘grid‘;
                    ‘Properties‘=‘Name‘,
                    @{n=‘Title‘;e={$_.title};css={if($_.title -like "*Senior*"){‘green‘}}},
                    @{n=‘Email‘;e={$_.primarysmtp}},
                    ‘Mobile‘,‘Extension‘,‘OU‘,
                    @{n=‘Company‘;e={$_.company};css={if($_.company -eq "Rapp"){‘red‘}}}
               }
        
$user=import-csv C:\scripts\users.csv | ConvertTo-EnhancedHTMLFragment @params
 $params = @{‘CssStyleSheet‘=$style2;
                    ‘Title‘="User Lists";
                    ‘PreContent‘="<h1>System Report for Users</h1>";
            ‘HTMLFragments‘[email protected]($user);
                   }
 ConvertTo-EnhancedHTML @params |
 Out-File -FilePath C:\temp\tt.html

结果如下

测试成功。

通过上面的方式,我可以灵活的变通,把我获取的结果转换成更精致的网页界面展现出来。

时间: 2024-10-21 13:15:55

Powershell 创建炫丽美观的Html报表的相关文章

Azure VMSS ---- PowerShell创建自定义镜像的VMSS集群

前面一篇文章介绍了如何用PowerShell创建标准镜像的VMSS集群.http://www.cnblogs.com/hengwei/p/7391178.html 本文将介绍,如何用PowerShell创建自定义镜像的VMSS集群. 1 创建VM,对其进行个性化配置,比如安装httpd,增加Date Disk等,并把此VM捕获成Image 2 以这个Image创建VMSS集群 一 创建并捕获Image 这个操作在前面的文章中也介绍过: http://www.cnblogs.com/hengwei

PowerShell创建Windows服务

旧服务器要淘汰,上面的自定义的Windows服务要迁移: 一.创建服务 (1)将自定义的Windows服务所需要的文件复制到新服务器上: (2)使用powershell在新服务器上创建新的Windows服务,命令如下: new-service –Name OrderService –DisplayName OrderService –BinaryPathName "D:\order\OrderService.exe" –StartupType Automatic (3)检查创建成功:

使用PowerShell 创建SharePoint 网站

使用PowerShell 创建SharePoint 网站 在SharePoint开发中,你应该学会使用PowerShell管理SharePoint站点.SharePoint Management Shell是一个Windows PowerShell模块,你可以用它高效管理SharePoint 用户.站点.网站集和组织. 这里教你简单的语句,创建一个SharePoint网站. 输入一下语句.红色框内信息是按下Enter后出现的. 建立的网站如下: 首先我们需要理解如何使用PowerShell创建站

windows azure使用powershell创建虚拟机

上篇博文介绍了如何使用powershell控制azure虚拟机的启动和关闭,今天我们介绍下如何使用powershell创建虚拟机 首先,使用powershell登录azure,并查看虚拟机列表 首先,我们需要设定下虚拟机创建的环境 使用get-azuresubscription命令获取订阅名称信息 使用get-azurestorageaccount获取存储账户的名称 我们使用命令set-azuresubscription -subscriptionname "windows azureenter

通过PowerShell创建SharePoint Site Collection。

通过PowerShell创建SharePoint Site Collection,代码如下: Add-PSSnapin microsoft.sharepoint.powershell function CreateTeamSite() { $webApps = Get-SPWebApplication $webAppsUrl = $webApps.Url if($webApps.count -eq 1) { Write-Host "You have only one web applicatio

Azure VMSS ---- PowerShell创建标准镜像的VMSS集群

VMSS的创建可以采用Portal.Powershell.Azure CLI或者Template. 但目前Portal创建有很多限制,本文将介绍如何用PowerShell来创建VMSS的集群. 具体的创建过程有以下几个步骤: 1 创建Resource Group 2 创建Vnet 3 创建Public IP.LoadBalancer 4 创建VMSS 5 增加VMSS的Autoscale规则 一 创建Resource Group 具体命令如下: $loc = 'chinanorth'; $rgn

使用Powershell创建新森林,添加第一台域控制器

Powershell 是运行在Windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆.Powershell需要.NET环境的支持,同时支持.NET对象.微软之所以将Powershell 定位为Power,并不是夸大其词,因为它完全支持对象.其可读性,易用性,可以位居当前所有shell之首. 当前powershell有四版本,分别为1.0,2.0,3.0 ,4.0 如果您的系统是window7或者Windows Serv

[Redis]如何通过Powershell创建Redis服务

目前Redis在中国上线了,不过只是预览版而且不能通过Portal进行操作,不过可以通过Powershell创建,具体如下: 下载最新的Powershell SDK:http://www.windowsazure.cn/downloads/ Switch-AzureMode -name AzureResourceManager Add-AzureAccount -Environment AzureChinaCloud Get-AzureSubscription –Current New-Azur

在Azure上通过Powershell创建多Interface的Cisco CSR路由器

前面通过Json的Template在Azure上创建了Cisco的CSR路由器.但那个Json的template只支持1块网卡.如果需要多网卡的Cisco CSR路由器,可以改上篇文章中提到的Json Template文件,也可以用Powershell的脚本创建. 本文将介绍如何用Powershell创建多Interface的Cisco CSR路由器. 一.确定Cisco CSR Image的位置 和上篇文章相同,Cisco CSR Image的链接如下,我把这个文件public出来了,大家可以