修复 PowerShell 中的 System.Object[]

Fixing System.Object[] in PowerShell

我有一个脚本可以 ping 脱机工作站列表,然后如果工作站脱机则查询 SCCM 以获取描述。然后它获取工作站 ID 和描述并将其放入电子邮件正文中并将其发送到特定地址。

只要我只输出变量,该脚本在 PowerShell 中运行良好。如果我使用 Send-MailMessage cmdlet,电子邮件正文中唯一显示的是 System.Object[].

我该如何解决这个问题?我已阅读有关 -join 属性的信息,但我不太确定将其添加到我的脚本中的位置。

$list = Get-Content "C:\Users$env:UserName\Desktop\workstations.txt"

foreach ($workstation in $list) {
    $test = Test-Connection -BufferSize 32 -Count 1 -ComputerName $workstation -Quiet
    $WQLquery = @"
select SMS_G_System_OPERATING_SYSTEM.Description from
SMS_R_System inner join SMS_G_System_SYSTEM on
SMS_G_System_SYSTEM.ResourceID = SMS_R_System.ResourceId inner join 
SMS_G_System_OPERATING_SYSTEM on 
SMS_G_System_OPERATING_SYSTEM.ResourceId = SMS_R_System.ResourceId where SMS_G_System_SYSTEM.Name = '$workstation'
"@

    $description = Get-WmiObject -Query $WQLquery -ComputerName 'WORKSTATIONHERE' -Namespace 'root\sms\SITEHERE' |
                   Select-Object  Description
    if ($test -match "false") {
        $offlinelist += ,@("$workstation", $description)
    }
}

$offlinelist
Send-MailMessage -To "TOTHEUSER" -From "FROM" -Subject "Offline Workstations" -SmtpServer "SMTPHERE" -Body "<p>These workstations are offline: </p> $offlinelist" -BodyAsHtml

如果您构建(自定义)对象数组并将带有该数组的变量放入字符串中,PowerShell 会将其扩展为对象数组的字符串表示形式,即 System.Object[].

您真正想要的是工作站 ID 和描述的 HTML table(因为无论如何您发送的邮件都是 HTML。

$offlinelist = foreach ($workstation in $list) {
    ...
    if ($test -match "false") {
        New-Object -Type PSObject -Property ([ordered]@{
            ID          = $workstation
            Description = $description
        })
    }
}

$body = $offlinelist |
        ConvertTo-Html -Fragment -PreContent '<p>These workstations are offline:</p>' |
        Out-String
Send-MailMessage ... -Body $body -BodyAsHtml