Новые строки и / или символы возврата каретки не конвертируются - PullRequest
0 голосов
/ 08 мая 2020

Отредактировал мой вопрос, чтобы попытаться сделать его более понятным - версия 2: -)

У меня есть следующий код в дисковом модуле внутри функции, которая использует Get-WmiObject, который помещает данные в строка $ LogMsg, которая затем используется intern в функции LogToEmail, которая находится в другом модуле (LogToEmail "Недостаточно места на диске" $ LogMsg;)

    if ($AlertPercent -gt 0)
    {
        $filter = "DeviceID='" + $DriveLetter + "'";
        $body = (Get-WmiObject -Class Win32_LogicalDisk -ComputerName $ServerName -Filter $filter |
                        Where-Object {$_.DriveType -eq 3 -and ((($_.FreeSpace/$_.Size*100) -as [float]) -lt $AlertPercent)} |
                        Sort-Object -Property Name | 
                        Select-Object @{"Label"="Server";"Expression"={"{0:N}" -f ($_.SystemName)}},
                                                        Name,
                                                        VolumeName,
                                                        FileSystem,
                                                        Description,
                                                        VolumeDirty,
                                                  @{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}},
                                                  @{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}},
                                                  @{"Label"="%Free";"Expression"={"{0:N}" -f ($_.FreeSpace/$_.Size*100) -as [float]}} |
                            Format-Table -AutoSize | Out-String);
    }
    else
    {
        $filter = "DeviceID='" + $DriveLetter + "'";
        $body = (Get-WmiObject -Class Win32_LogicalDisk -ComputerName $ServerName -Filter $filter |
                        Where-Object {$_.DriveType -eq 3} |
                        Sort-Object -Property Name | 
                        Select-Object @{"Label"="Server";"Expression"={"{0:N}" -f ($_.SystemName)}},
                                                        Name,
                                                        VolumeName,
                                                        FileSystem,
                                                        Description,
                                                        VolumeDirty,
                                                  @{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}},
                                                  @{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}},
                                                  @{"Label"="%Free";"Expression"={"{0:N}" -f ($_.FreeSpace/$_.Size*100) -as [float]}} |
                            Format-Table -AutoSize | Out-String);
    }

    if ($body.Length -gt 0)
    {
      #Set the log message
        $LogMsg = "The following drive '" + $pDriveLetter + "', on server '" + $ServerName + "', is low on space.`n" + $body.Trim();

        #Log the stopped service(s) to the log file
        LogToFile $LogMsg;

        #Log the stopped service(s) to the host screen
        LogToHost $LogMsg;

        #Log the stopped service(s) to the email receipient
        LogToEmail "Drive space is low" $LogMsg;
    }

    #Set log information message 
    $LogInfoMsg = "Ended checking drive space on server:" + $ServerName;

    #Log the date and time started checking searched service(s) on the server
    LogToFile $LogInfoMsg

    #Log the date and time started checking searched service(s) on the server
    LogToHost $LogInfoMsg
}
catch
{
    #write out the error into a string format
    $LogMsg = "- ERROR: " + ($_.Exception.ErrorRecord | Out-String);

    #Log the error message to the log file
    LogToFile $LogMsg;

    #Log the error message to the host screen
    LogToHost $LogMsg;

    #Log, the error message to the email recipient
    LogToEmail ("PowerShell error on " + (split-path $MyInvocation.PSCommandPath -leaf)) $LogMsg;
}

$ LogMsg затем передается в модуль журнала как

$Message = New-MimeMessage $global:EmailFrom $global:EmailTo $Subject $LogMsg $global:EmailCC

, а затем в модуль электронной почты как $ Body в качестве строкового параметра в функции New-MimeMessage, которая должна преобразовать его в HTML с помощью функции ConvertTo- HTML.

    $BodyAsHtml = $global:BodyAsHTML
    if ($BodyAsHtml)
    {
        $TextPart = New-Object MimeKit.TextPart("html")
        #$RetConstructedMessage = $true
    }
    else
    {
      $TextPart = New-Object MimeKit.TextPart("plain")
    }

    $Header = "
              <style>
              DIV {font-family:'courier', monospace}
              </style>
              "
    $BodyHTML = ConvertTo-Html -Head $Header -Body $Body | Out-String
    $TextPart.Text = $BodyHTML

Однако ConvertTo- Html не кодирует новую строку / возврат каретки, хотя отладчик в Visual Studio Code, кажется, отображается правильно, но через браузер в GMail или Microsoft Outlook после отправки электронной почты , он отображается как сплошной однострочный. Я не использую код HTML для принудительного переноса строк там, где мне нужно, поскольку Get-WmiObject должен иметь их, поскольку обычный текст помещает новые строки и / или символы возврата каретки. Я включил изображения, чтобы попытаться улучшить то, что я вижу.

Наведение на $ Body HTML строковая переменная в отладчике Visual Studio Code Mousing over $BodyHTML string variable in Visual Studio Code debugger

Просмотр электронной почты в браузере в GMail The email view on the browser on GMail

Просмотр электронной почты в браузере Microsoft Outlook The email view on the browser on Microsoft Outlook

1 Ответ

1 голос
/ 09 мая 2020

Как уже отмечалось, вам необходимо удалить | Format-Table -AutoSize | Out-String при создании переменной $body.
Это вернет строку в виде таблицы как , отформатированную только для экрана консоли . Вы можете проверить с помощью $body.GetType().FullName, который из-за | Format-Table -AutoSize | Out-String вернет System.String

Если вы оставите это, $body.GetType().FullName показывает, что это System.Object[]

Это что вам нужно для ConvertTo-Html, чтобы он мог создать таблицу в стиле HTML из этих данных.

Если вам нужна таблица формата в журнале, используйте новую переменную, чтобы получить формат таблицы, который вы хотите туда или сделайте длинную строку:

$LogMsg = "The following drive '$pDriveLetter', on server '$ServerName', is low on space.`r`n{0}" -f ($body | Format-Table -AutoSize | Out-String).Trim()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...