Выходные данные Azure Runbook на электронную почту

Я пытаюсь отправить выходные данные о состоянии виртуальной машины из Runbook автоматизации Azure в электронную почту. Я использую следующий код:

function Send-EMail {
Param (
    [Parameter(Mandatory=$true)]
    [String]$EmailTo,
    [Parameter(Mandatory=$true)]
    [String]$Subject,
    [Parameter(Mandatory=$true)]
    [String]$Body,
    [Parameter(Mandatory=$false)]
    [String]$EmailFrom="noreply@idlebytes.com",  #This gives a default value to the $EmailFrom command
    [parameter(Mandatory=$false)]
    [String] $SmtpServer = (Get-AutomationVariable -Name 'SmtpHost'),
    [parameter(Mandatory=$false)]
    [String] $SmtpUsername = (Get-AutomationVariable -Name 'SmtpUsername'),
    [parameter(Mandatory=$false)]
    [String] $SmtpPassword = (Get-AutomationVariable -Name 'SmtpPassword')
)

    $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
    $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25) 
    $SMTPClient.EnableSsl = $true 
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($SmtpUsername, $SmtpPassword); 
    $SMTPClient.Send($SMTPMessage)
    Remove-Variable -Name SMTPClient
    Remove-Variable -Name SmtpPassword

} #End Function Send-EMail

$AutomationCredentialAssetName = "PScredential"

# Get the credential asset with access to my Azure subscription
$Cred = Get-AutomationPSCredential -Name $AutomationCredentialAssetName

# Authenticate to Azure Service Management and Azure Resource Manager

Add-AzureRmAccount -Credential $Cred | Out-Null

$VMStatus = Get-AzureRmVM -Name "vm0" -ResourceGroupName "TestRG" -Status


Send-EMail -EmailTo "admin@idlebytes.com" -Body "$VMStatus" -Subject "vm0 Status"

Я ожидаю, что вывод электронной почты будет печатать точное состояние вывода, в то время как он печатает объект Microsoft.Azure.Commands.Compute.Models.PSVirtualMachineInstanceView'

Может кто-то помочь, как получить содержимое объекта в виде строки в электронной почте?

2 ответа

Решение

Добавление ссылки на переменную (например, $MyVar) в тело сообщения электронной почты, которая по умолчанию просто возвращает тип объекта, где выходные данные в PowerShell представляют собой специальное действие конвейера, которое отображает содержимое либо в виде списка, либо в виде таблицы. Чтобы включить контент в электронное письмо, мы должны были бы отдельно ссылаться на различные свойства.

Ниже приведен пример:

[string]$EmailBody = (“Property 1 = [{0}], Property 2 = [{1}], Property 3 = [{2}]” -f $MyObject.Property1, $MyObject.Property2, $MyObject.Property3)

В приведенной выше строке будет установлена ​​переменная $EmailBody, которая является строкой, включающей три свойства объектной переменной с именем $MyObject. Если бы мы просто ссылались на $ MyObject для вывода PowerShell, все свойства отображались бы, но чтобы включить свойства в электронное письмо, мы должны ссылаться на них по отдельности.

Пожалуйста измените

$VMStatus = Get-AzureRmVM -Name "vm0" -ResourceGroupName "TestRG" -Status

к

$VMStatus = Get-AzureRmVM -Name "vm0" -ResourceGroupName "TestRG" -Status | select -expand Statuses

Первая команда возвращает объект PSVirtualMachineInstanceView, а вторая команда возвращает массив строк.

Другие вопросы по тегам