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