设为首页 收藏本站
查看: 1034|回复: 0

Powershell 创建炫丽美观的Html报表

[复制链接]

尚未签到

发表于 2018-9-2 08:06:12 | 显示全部楼层 |阅读模式
  我们通过PowerShell可以获取各种信息,如何保存这些获取的信息呢?最简单的方法是保存为csv或者是xml文件,这样可以轻松的导入导出。不过这两种文件在人眼的可读性上都不够美观。xml从程序的角度非常方便,但是看起来很不舒服;同样的,尽管csv文件可以通过Excel打开,但是最重要的一点,他没有颜色!对于很多习惯把Excel表格标注的五颜六色的人来说,csv的世界实在是太昏暗了。
  那么直接保存为XLSX文件如何呢?传统的PowerShell对Office的支持很不好,只能通过ComObject来操作。但是微软官方直接告诉你这种方式有bug,很慢而且很不稳定。幸运的是,最新的PowerShell 5可以直接下载Excel的模块了,这是直接通过.Net的一个dll文件来调用的,迅速稳定,可以说是一个巨大的福音。有兴趣的可以从PowerShell Gallery下载使用。他可以直接生成报表甚至是图表。
  具体的使用方法可以参考
  https://blogs.technet.microsoft.com/heyscriptingguy/2015/11/25/introducing-the-powershell-excel-module-2/
  本文主要是关注第三种方式,把结果保存为HTML的网页格式。把PS对象转换成HTML对象并不是什么新东西,PS自带的ConvertTo-HTML命令就能做到,不过这个命令的性能不够强,只是泛泛的生成一个结果,并不能根据条件对一些特定的表格或者列表设定格式或者颜色,因此又有很多人开发了自己的高级函数。
  首先来看一个很传统的笨方法。
  比如说下面截取自某网友提供的片段
DSC0000.png

  这种方法是通过一个一个的表格单元硬写成HTML的格式。首先这就违反了一个编写PowerShell function的基本原则,每一个function的输出对象应该有且只有一个,获取对象和输出对象的方式应该属于不同的function,很明显,上面的例子把获取对象和输出对象强行的拧在一个地方实现了,不仅混乱而且写的很难看。
  PowerShell本身具有一个简单但是很实用的命令 ConvertTo-Htm,可以把整个对象转换成HTML格式。事实上,虽然很多人诟病他不够强大,作为基本的功能他已经可以实现一些漂亮的界面了。
  比如说 我首先定义一个简单的style,然后执行一个function获取指定计算机的磁盘信息,转换成Html然后保存
$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}
  
"@
  
Get-DiskInfo -computername yli-ise | ConvertTo-Html -Body "DiskInfo" -Head $style | out-file C:\temp\disk.html
  
invoke-item c:\temp\disk.html
  效果如下所示
DSC0001.png

  这种方式可以通过指定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 "DiskInfo" -Head $style |  
Set-CellColor -Property FreeSpace -color red -filter "FreeSpace -lt 20" | out-file C:\temp\disk.html
  效果如下
DSC0002.png

  上面这种修改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 = @"  

  
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;
  
}
  

  
"@
  
$params = @{
  
                    'As'='Table';
  
                    'PreContent'='Users List';
  
                    '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'="System Report for Users";
  
            'HTMLFragments'=@($user);
  
                   }
  
ConvertTo-EnhancedHTML @params |
  
Out-File -FilePath C:\temp\tt.html
  结果如下
DSC0003.png

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-561327-1-1.html 上篇帖子: Powershell学习之道-文件夹共享及磁盘映射 下篇帖子: Powershell日常AD管理-1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表