Powershell 计划任务中的Send MailMessage编码错误

Powershell 计划任务中的Send MailMessage编码错误,powershell,encoding,Powershell,Encoding,我使用以下脚本向不同的人发送两封电子邮件: # 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 zusamme

我使用以下脚本向不同的人发送两封电子邮件:

# 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
}
当我在VisualStudio代码中运行代码时,这就可以工作了,但是我需要在服务器上安排一个任务来运行它。当计划任务运行脚本时,它无法处理邮件正文中的UMLAUT,例如,它发送üasü

我怎样才能解决这个问题?我已经指定了我的编码

我的任务是这样设置的:

启动一个程序:PowerShell

参数:-Command&'\\server\path\script.ps1'-ExecutionPolicy旁路


编辑:我注意到启动的PowerShell是旧的PowerShell,它有一个黑色的背景。这可能是问题所在吗?如何启动新文件?

PowerShell在读取.ps1文件时会解释该文件的源代码,但不一定是您期望的编码

如果将文件另存为UTF-8,但PowerShell的默认值为Windows-1252,那么在代码运行之前,ü就变成了ü。Send MailMessage然后将ü正确编码为UTF-8,因此这些字符保留在电子邮件中。从Visual Studio代码中运行程序时,会应用不同的默认值,结果也会不同

我不认为有命令行开关可以强制PowerShell以某种编码解释脚本文件,但您可以通过在文件前面添加字节顺序标记BOM来帮助编码自动检测

对于UTF-16,BOM是必需的,UTF-16在各种Microsoft工具中通常称为Unicode编码,但在UTF-8中是可选的。UTF-8 BOM在许多用例中都是错误的,因此VS代码默认为不带BOM的UTF-8。当您将文件显式保存为带有BOM的UTF-8时,Powershell将在读取脚本时推断正确的编码

有一种方法可以将VS代码配置为根据文件类型选择特定编码,您可以将其设置为始终将.ps1文件保存为带有BOM的UTF-8


另一种方法是将文件另存为Windows-1252,这将符合PowerShell在您机器上的预期,但在不同的计算机上或从VS代码中运行时可能会中断。

这表示PowerShell已使用错误的编码读取源代码,或者源文件没有以正确的编码保存。作为第一步,请确保编辑器将ps1文件保存为带有BOM的UTF-8,并查看这是否已经有所帮助。@Tomalak哦,这很容易!非常感谢。首先,我必须将Visual Studio代码中的files.encoding设置设置为utf8bom。然后再次保存我的脚本,方法是单击编辑器底部的“编码”按钮并选择“使用编码保存”,即UTF-8Bom@Tomalak如果你关心35个额外的声誉,即使你已经得到了这么多!你可以把它扩展成一个答案,我很乐意接受。否则我会在周四之前回复我自己的帖子