我有下面的代码,该代码将检查所有服务器的通用服务状态,并且将根据服务器列表检查某些服务。 如果它是应用服务器,它将检查服务器的特定列表,如果它是数据库服务器,则将检查服务的特定列表。
下面的代码工作正常,我正在控制台中获得输出。我只面临在html表中获取此问题,我希望结果如下:
Common Service Check
ServerA service1 running
ServerA service2 running
Serverx service1 running
Servery service2 running
Application Status
ServerA service3 running
ServerA service4 running
DB Server Status
Serverx service5 running
Servery service6 running
下面是代码:
$server = Import-Csv "\path\server.txt"
foreach($ServerName in $server)
{
$IDE = $($ServerName.types)
$hostname = $($ServerName.sname)
$CService = @('service1*'
'service2')
foreach($commonser in $CService)
{
$servicecomm = Get-Service "$commonser" -ComputerName $hostname
write-host $servicecomm.MachineName $servicecomm.name $servicecomm.Status
}
#write-host $IDE
#write-host $hostname
If ($IDE -eq "APP")
{
$APPList = @(
'Service3'
'Service4*'
)
foreach($appslist in $APPList)
{
$serviceapp = Get-Service "$appslist" -ComputerName $hostname
Write-Host $serviceapp.MachineName $serviceapp.name $serviceapp.Status
}
}
elseif($IDE -eq "DB")
{
$DBList = @(
'service5'
'service6'
)
foreach($dblist in $DBList)
{
$servicedb = Get-Service "$dblist" -ComputerName $hostname
Write-Host $servicedb.MachineName $servicedb.name $servicedb.Status
}
}
服务器列表的文本文件下方
types,sname
APP,ServerA
APP,ServerB
DB,ServerX
DB,ServerY
答案 0 :(得分:1)
首先,您需要设计HTML
格式的页面以适合您的需求。这是一个简短的示例,说明如何使用您拥有的脚本构建 HTML
页面。像这样:
$HTML = '<html>
<body>
<head>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
text-align: left;
}
</style>
</head>'
$HTML_CommonServiceCheck = '<table><tr><th>Common Service Check</th></tr>'
$HTML_ApplicationStatus = '<table><tr><th>Application Status</th></tr>'
$HTML_DBServerStatus = '<table><tr><th>DB Server Status</th></tr>'
$server = @(Import-Csv '\path\server.txt')
foreach($ServerName in $server)
{
$IDE = $($ServerName.types)
$hostname = $($ServerName.sname)
$CService = @('service1','service2')
foreach($commonser in $CService)
{
$servicecomm = Get-Service $commonser -ComputerName $hostname
$HTML_CommonServiceCheck += '<tr><td>{0} {1} {2}</td></tr>' -f $servicecomm.MachineName, $servicecomm.name, $servicecomm.Status
}
If ($IDE -eq "APP")
{
$APPList = @('service3','service4*')
foreach($appslist in $APPList)
{
$serviceapp = Get-Service $appslist -ComputerName $hostname
$HTML_ApplicationStatus += '<tr><td>{0} {1} {2}</td></tr>' -f $serviceapp.MachineName, $serviceapp.name, $serviceapp.Status
}
}
elseif($IDE -eq "DB")
{
$DBList = @('service5','service6')
foreach($dblist in $DBList)
{
$servicedb = Get-Service $dblist -ComputerName $hostname
$HTML_DBServerStatus += '<tr><td>{0} {1} {2}</td></tr>' -f $servicedb.MachineName, $servicedb.name, $servicedb.Status
}
}
}
$HTML_CommonServiceCheck += '</table>'
$HTML_ApplicationStatus += '</table>'
$HTML_DBServerStatus += '</table>'
$HTML += $HTML_CommonServiceCheck
$HTML += $HTML_ApplicationStatus
$HTML += $HTML_DBServerStatus
$HTML += '</body></html>'
答案 1 :(得分:1)
开始时,您将需要收集结果,而不仅仅是像现在一样将它们输出到屏幕上。不过,我稍后再讲。首先,让我们快速看一下Get-Service
。如果运行Get-Help Get-Service
,则会看到一个语法设置为的参数:
Get-Service [[-Name] <String[]>] [-ComputerName <String[]>] [-DependentServices] [-Exclude <String[]>] [-Include <String[]>] [-RequiredServices] [<CommonParameters>]
现在,告诉我的是,-Name
参数采用字符串数组(如<String[]>
所示,因为如果仅接受单个字符串,它将被列为<String>
)。它还接受-ComputerName
参数的字符串数组。这意味着我们每个类别可以运行一次命令,因此只需运行3次,这样可以加快速度。除此之外,我们可以将结果输出为HTML片段,然后将这些片段组合为一个HTML页面,我们可以将其输出到文件并在Web浏览器中打开。
所以首先我们从服务器获取数据:
$server = Import-Csv "\path\server.txt"
$CService = @('service1*','service2')
$APPList = @('Service3','Service4*')
$DBList = @('service5','service6')
$CServiceResults = Get-Service $CService -ComputerName $server.sname
$APPListResults = Get-Service $APPList -ComputerName $server.sname
$DBListResults = Get-Service $DBList -ComputerName $server.sname
现在有了数据,我们可以为每个表创建HTML片段,包括每个表的标题。我们必须将输出转换为字符串,以便以后可以将它们全部合并:
$CServiceFrag = $CServiceResults | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>Common Services</H2>" -Fragment | Out-String
$APPListFrag = $APPListResults | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>App Services</H2>" -Fragment | Out-String
$DBListFrag = $DBListResults | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>DB Services</H2>" -Fragment | Out-String
我们应该添加一些格式,以使表格看起来更美观,因此该报告不会给人留下深刻的印象。
$Header = @"
<style>
H1, H2 {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
}
table {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
table, td, th {
border: 1px solid #ddd;
padding: 8px;
}
table tr:nth-child(even){background-color: #f2f2f2;}
table tr:hover {background-color: #ddd;}
table th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #3366FF;
color: white;
}
</style>
"@
然后,将所有内容与ConvertTo-HTML
放在一起,并将其输出到文件中。有了文件后,我们只需使用Invoke-Item
在默认浏览器中将其打开。
ConvertTo-Html -Head $Header -Pre "<H1>Service Status Report</H1>" -PostContent $CServiceFrag,$APPListFrag,$DBListFrag|Set-Content C:\Temp\Services.htm
Invoke-Item C:\temp\Services.htm
请注意,我的HTML技能很垃圾,因此样式信息几乎是从https://www.w3schools.com/css/css_table.asp中窃取的,我做了一些猜测和修改以适应需要。
编辑:我无法设置颜色,但是如果您不介意在输出到网页之前进行设置,则可以为您提供帮助。为此,您将修改创建HTML片段的行。例如,如果要按服务器名称对常用服务进行排序,可以执行以下操作:
$CServiceFrag = $CServiceResults | Sort MachineName | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>Common Services</H2>" -Fragment | Out-String
如果您希望按服务名称对其进行排序,则可以将Sort MachineName
更改为Sort ServiceName
。