Send-MailMessage в запланированном задании имеет неправильную кодировку - PullRequest
0 голосов
/ 29 октября 2019

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

# Datum von nächstem Samstag ermitteln
$Date = Get-Date "18:00"
while ($Date.DayOfWeek -ne "Saturday") { $date = $date.AddDays(1) }

# UTF-8 Encoding
$utf8 = New-Object System.Text.utf8encoding

# E-Mail Benachrichtigung zusammenstellen
$EmailNotifications = @{

    AlleMAEmail = @{
        From = "xy"
        To = "xy"
        Subject = "Serverarbeiten Update Installation $($Date.DateTime)"
        Body = "abc äöü"
    }

    ITAdminEmail = @{
        From = "xy"
        To = "xy"
        Subject = "Bitte bei XY Updates genehmigen & Ablehnen"
        Body = "abc äöü"
    }

}

# E-Mails versenden.
$EmailNotifications.GetEnumerator() | ForEach-Object {
    $splat = $_.Value
    Send-MailMessage -SmtpServer "xy" -BodyAsHtml -Encoding $utf8 @splat
}

Это работает, когда я запускаю код в коде Visual Studio, однако мне нужно запланированное задание на сервере для запускаэто. Когда запланированное задание запускает сценарий, оно не может обработать умлауты в теле письма, например, отправляет ü как ü

Как это исправить? Я уже указал свою кодировку

Вот так настроена моя задача:

  • Запустить программу: PowerShell

  • Аргументы: -Command "& '\\server\path\script.ps1'" -ExecutionPolicy Bypass

Редактировать: Я заметил, что запускаемый PowerShell - это "старый" PowerShell с черным фоном. Может ли это быть проблемой? Как запустить новый?

1 Ответ

1 голос
/ 29 октября 2019

PowerShell интерпретирует исходный код файла .ps1 при его чтении, но не обязательно в ожидаемой кодировке.

Когда вы сохраняете файл как UTF-8, но по умолчанию PowerShell - Windows-1252затем ü становится ü еще до того, как ваш код запустится. Send-MailMessage затем корректно кодирует ü в UTF-8, поэтому эти символы сохраняются в электронном письме. Когда вы запускаете программу из кода Visual Studio, применяются разные значения по умолчанию, и результат отличается.

Я не думаю, что есть переключатель командной строки, который заставляет PowerShell интерпретировать файлы сценариев в определенной кодировке, новы можете помочь с автоматическим определением кодировки, добавив к файлу префикс с меткой порядка байтов (BOM).

Спецификация является обязательной для UTF-16 (то, что обычно называют кодировкой «Unicode» в различных Microsoftинструменты), но необязательно в UTF-8. Спецификации UTF-8 неправильны во многих случаях использования, поэтому по умолчанию для кода VS указано «UTF-8 без спецификации». Когда вы явно сохраняете файл как «UTF-8 с спецификацией», Powershell выводит правильную кодировку при чтении сценария.

Существует способ настроить VS Code для выбора определенных кодировок для каждого типа файла, вы можетеустановите для него постоянное сохранение файлов .ps1 как UTF-8 с спецификацией.

Альтернативой может быть сохранение файла в формате Windows-1252, что будет соответствовать ожиданиям PowerShell на вашем компьютере, но может сломаться на других компьютерах (или при запуске из кода VS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...