0

至少我认为我已经准备好了一切。我想通过电子邮件向自己发送 Get-WmiObject win32 命令的输出。例子:

$OS = "."
(Get-WmiObject Win32_OperatingSystem).Name |Out-String

 $secpasswd = ConvertTo-SecureString "mypassword" -AsPlainText -Force
    $mycreds = New-Object System.Management.Automation.PSCredential 
("support@myemail.com", $secpasswd)

    Send-MailMessage -To "support@myemail.com" -SmtpServer 
"smtp.office365.com" -Credential $mycreds -UseSsl "Backup Notification" -
Body $body -From "support@myemail.com"

我尝试了以下方法:

$body = (
  Write-Host "Computer Info:" -Message $PCinfo
  ) -join "`r`n"
    Write-Verbose -Message $body

这将返回错误:“无法验证参数 'Body' 上的参数。参数为空或空。”

任何方向、建议或示例将不胜感激。谢谢

4

2 回答 2

2

这种格式给你一些更丰富的信息。这将获取Win32_OperatingSystem类的内容并将其转换为 HTML 表格,将其附加到$body变量中,并在其上方添加您的“计算机信息:”文本:

$body = "Computer Info: <br>"
$body += Get-WmiObject -Class Win32_OperatingSystem | ConvertTo-HTML -Fragment

$body通过管道将其有效地重新创建到Out-String. 这确保它是一个字符串对象,其-Body参数Send-MailMessage需要:

$Body = $Body | Out-String

最后,在调用时Send-MailMessage使用 -BodyAsHTML 参数确保电子邮件作为 HTML 电子邮件发送:

Send-MailMessage -To "support@myemail.com" -From "support@myemail.com" -SmtpServer "smtp.office365.com" -Credential $mycreds -UseSsl "Backup Notification" -Body $body -BodyAsHTML
于 2017-05-09T16:29:52.590 回答
1

Write-Host绕过通常的 PowerShell 数据路由(管道);您可能想研究Get-Help Out-StringGet-Help Out-Default寻找可能的替代方案。

在使用 绕过管道时Write-Host,您将分配保留为$body“空” - 也就是说,没有数据可分配给变量。由于$null是变量具有的合法值,因此这不会引发错误,直到在不允许空值的上下文中使用该变量(例如 with Send-MailMessage)。

于 2017-05-09T15:22:13.423 回答