Powershell html table 不会在邮件中显示加入
Powershell html table won't show in mail with join
我今天开始编写一个脚本来遍历所有服务器上的证书存储,以捕获将在 30 天内到期的所有证书。
一旦我开始循环服务器,我就添加了 -join 以加入循环中的所有数据,然后 table 将不再显示在邮件中,只有无边框的数据。
即使我很久以前就将此代码用于 table,我也没有得到设计的 table。
我还想在每个 table.
上方添加 $env:COMPUTERNAME
最终目标是从每个服务器获得一个 table 如果不清楚但在同一封邮件中。
代码:
$pathRead = "D:\temp\lista.txt"
$smtpserver = "-"
$mailsender ="-"
$mailReceiver = "-"
$mailSubject = "Certificates about to expire"
$dagarkvar=30
<#
$settings = @{
"TargetServerURI" = "vmrydsqli01.rydsbilglas.internal";
"TargetServerUser" = "rydsglas\svc-qliksense-prod";
}
#>
$head=@"
<style>
@charset "UTF-8";
table
{
font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
border-collapse:collapse;
}
td
{
font-size:1em;
border:1px solid #98bf21;
padding:5px 5px 5px 5px;
}
th
{
font-size:1.1em;
text-align:center;
padding-top:5px;
padding-bottom:5px;
padding-right:7px;
padding-left:7px;
background-color:#A7C942;
color:#ffffff;
}
name tr
{
color:#F00000;
background-color:#EAF2D3;
}
</style>
"@
$output = foreach($line in Get-Content $pathRead) { Invoke-Command -ComputerName $line -ScriptBlock { Get-ChildItem Cert:\LocalMachine\My | select Subject, FriendlyName, Thumbprint, Notafter | ConvertTo-Html -head $header | out-string
Where-Object {$_.NotAfter -gt (Get-Date) -and $_.NotAfter -lt (Get-Date).AddDays($Dagarkvar)}
}
}
Send-MailMessage -From $mailsender -to $mailReceiver -subject $mailSubject -Body (-join $output ) -SmtpServer $smtpServer -Port 25 -BodyAsHtml
我做错了什么以及如何在每个 table 上添加 $env:COMPUTERNAME 作为 header 以查看 table 来自哪个服务器。
编辑:通过一些额外的返工得到的答案我可以提取数据,但到 table 但问题是只过滤 30 天内的证书。不想要所以看看 3 个月后过期或已经过期的东西。
正如所评论的,您在脚本块中的顺序是错误的,因为在 ConvertTo-Html ...
之前 您使用 Where-Object 对对象进行了额外的过滤条款。在 ConvertTo-Html 之后,您不再处理对象,而是格式化字符串。
此外,您定义了一个变量 $head
,但在脚本块中使用了 $header
。
只需让循环发出您在变量 $output
中收集的对象,然后在循环后将所有对象转换为 Html。
尝试:
$output = foreach($line in (Get-Content -Path $pathRead)) {
Invoke-Command -ComputerName $line -ScriptBlock {
Get-ChildItem Cert:\LocalMachine\My |
Where-Object {$_.NotAfter -gt (Get-Date) -and $_.NotAfter -lt (Get-Date).AddDays($Dagarkvar)} |
Select-Object @{Name = 'ComputerName'; Expression = {$env:COMPUTERNAME}}, Subject, FriendlyName, Thumbprint, Notafter
}
}
# create the html body. remove the extra properties added by PowerShell
$output = $output | Select-Object * -ExcludeProperty PS*, RunspaceId |
ConvertTo-Html -Head $head | Out-String
我今天开始编写一个脚本来遍历所有服务器上的证书存储,以捕获将在 30 天内到期的所有证书。
一旦我开始循环服务器,我就添加了 -join 以加入循环中的所有数据,然后 table 将不再显示在邮件中,只有无边框的数据。
即使我很久以前就将此代码用于 table,我也没有得到设计的 table。
我还想在每个 table.
上方添加 $env:COMPUTERNAME最终目标是从每个服务器获得一个 table 如果不清楚但在同一封邮件中。
代码:
$pathRead = "D:\temp\lista.txt"
$smtpserver = "-"
$mailsender ="-"
$mailReceiver = "-"
$mailSubject = "Certificates about to expire"
$dagarkvar=30
<#
$settings = @{
"TargetServerURI" = "vmrydsqli01.rydsbilglas.internal";
"TargetServerUser" = "rydsglas\svc-qliksense-prod";
}
#>
$head=@"
<style>
@charset "UTF-8";
table
{
font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
border-collapse:collapse;
}
td
{
font-size:1em;
border:1px solid #98bf21;
padding:5px 5px 5px 5px;
}
th
{
font-size:1.1em;
text-align:center;
padding-top:5px;
padding-bottom:5px;
padding-right:7px;
padding-left:7px;
background-color:#A7C942;
color:#ffffff;
}
name tr
{
color:#F00000;
background-color:#EAF2D3;
}
</style>
"@
$output = foreach($line in Get-Content $pathRead) { Invoke-Command -ComputerName $line -ScriptBlock { Get-ChildItem Cert:\LocalMachine\My | select Subject, FriendlyName, Thumbprint, Notafter | ConvertTo-Html -head $header | out-string
Where-Object {$_.NotAfter -gt (Get-Date) -and $_.NotAfter -lt (Get-Date).AddDays($Dagarkvar)}
}
}
Send-MailMessage -From $mailsender -to $mailReceiver -subject $mailSubject -Body (-join $output ) -SmtpServer $smtpServer -Port 25 -BodyAsHtml
我做错了什么以及如何在每个 table 上添加 $env:COMPUTERNAME 作为 header 以查看 table 来自哪个服务器。
编辑:通过一些额外的返工得到的答案我可以提取数据,但到 table 但问题是只过滤 30 天内的证书。不想要所以看看 3 个月后过期或已经过期的东西。
正如所评论的,您在脚本块中的顺序是错误的,因为在 ConvertTo-Html ...
之前 您使用 Where-Object 对对象进行了额外的过滤条款。在 ConvertTo-Html 之后,您不再处理对象,而是格式化字符串。
此外,您定义了一个变量 $head
,但在脚本块中使用了 $header
。
只需让循环发出您在变量 $output
中收集的对象,然后在循环后将所有对象转换为 Html。
尝试:
$output = foreach($line in (Get-Content -Path $pathRead)) {
Invoke-Command -ComputerName $line -ScriptBlock {
Get-ChildItem Cert:\LocalMachine\My |
Where-Object {$_.NotAfter -gt (Get-Date) -and $_.NotAfter -lt (Get-Date).AddDays($Dagarkvar)} |
Select-Object @{Name = 'ComputerName'; Expression = {$env:COMPUTERNAME}}, Subject, FriendlyName, Thumbprint, Notafter
}
}
# create the html body. remove the extra properties added by PowerShell
$output = $output | Select-Object * -ExcludeProperty PS*, RunspaceId |
ConvertTo-Html -Head $head | Out-String