博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Powershell 创建炫丽美观的Html报表
阅读量:6657 次
发布时间:2019-06-25

本文共 4424 字,大约阅读时间需要 14 分钟。

我们通过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然后保存

1
2
3
4
5
6
7
8
9
10
$style
=
@"
<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,下载之后直接调用就行了

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

1
2
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的话 这个模块可以直接下载安装。

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输出,奇偶行交错更改颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
$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'
=@(
$user
);
                   
}
 
ConvertTo-EnhancedHTML 
@params 
|
 
Out-File 
-FilePath C:\temp\tt.html

结果如下

测试成功。

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

本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1786712,如需转载请自行联系原作者
你可能感兴趣的文章
第一个kbmmw for Linux 服务器
查看>>
Java 8 类型转换及改进
查看>>
js继承
查看>>
JMeter运行通过Chrome打开的website
查看>>
C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符
查看>>
[bug]不包含“AsNoTracking”的定义
查看>>
ViewPager 入门一
查看>>
JAVA设计模式之工厂模式
查看>>
新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)
查看>>
hdu 思维风暴
查看>>
hive进行词频统计
查看>>
复旦大学2016--2017学年第二学期(16级)高等代数II期末考试第七大题解答
查看>>
linux kill杀死进程
查看>>
Git协作流程
查看>>
NET(C#):使用HttpWebRequest头中的Range下载文件片段
查看>>
java(9)并发编程
查看>>
删除表里重复数据
查看>>
HDOJ How many ways?? 2157【矩阵高速幂】
查看>>
Android--向SD卡读写数据
查看>>
mysql数据类型总结
查看>>