【问题标题】:Fixing System.Object[] in PowerShell在 PowerShell 中修复 System.Object[]
【发布时间】:2017-05-30 17:31:39
【问题描述】:

我有一个脚本可以 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

【问题讨论】:

    标签: arrays powershell-3.0 cmdlets


    【解决方案1】:

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

    你真正想要的是一个工作站 ID 和描述的 HTML 表(因为你还是以 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
    

    【讨论】:

    • 这看起来比我的代码好很多。当我运行它时,它返回一个错误:Send-MailMessage : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Body'. Specified method is not supported. 但是,如果我只使用write-host cmdlet 在 ISE 中显示$body 变量,则表明它正在生成 HTML 并正确显示自定义对象。我如何让它将System.Object[] 转换为字符串?
    • 啊,是的。 ConvertTo-Html 仍然产生一个数组。你也需要Out-String。查看更新的答案。
    • 您先生,让我头疼不已。我开始认为我必须处理将结果导出到 `.csv 并将其作为附件发送。我对 PS 还很陌生,自定义对象对我来说是一个陌生的概念。看来我需要开始更频繁地使用它们了!
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多