我有一个通过SMTP发送电子邮件的PowerShell脚本。该脚本在Powershell ISE中运行良好,但在任务计划程序中失败。我在Windows Server 2012上。我使用完全相同的设置在此服务器上运行其他Powershell脚本,但这些脚本不发送电子邮件。我在任务计划程序中看到的返回码是(0xFFFD0000),我找不到任何关于此的信息。我将任务设置为以最高权限运行,并且我已检查executionpolicy是否为RemoteSigned。有没有人遇到过这个?
以下是任务中的命令:
powershell -f "c:\scripts\EmailTest.ps1"
这是脚本:
$EmailFrom = "user@domain.com"
$EmailTo = "someone@somewhere.com"
$Subject = "Email Subject"
$Body = @"
Person,
Some message here
Thanks,
User
"@
$SMTPServer = "smtp.domain.com"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("user@domain.com", "password");
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
更新: 我能够解决这个问题。显然,我在脚本中添加了一行注释掉的内容。我不确定为什么这会导致错误但是一旦我删除了注释掉的行,它在任务调度程序中运行正常。评论看起来像这样,就在上面脚本中的其他$ EmailTo声明之下:
#$EmailTo = "someone@somewhere.com"
答案 0 :(得分:6)
我在查看类似问题时发现了另一个可能的问题。我无法将PowerShell脚本作为任务计划程序操作执行,即使在作为目标用户登录Windows并在PowerShell中运行时脚本正确运行。
当我使用我认为正常的PowerShell引用规则在任务的操作参数中指定脚本时,任务计划程序将始终显示0xFFFD0000错误:
-ExecutionPolicy Bypass -File 'D:\full path\to\script.ps1'
PowerShell默认并且任务计划程序立即启动了任务,当我将我使用的引号从单个更改为双时没有问题:
-ExecutionPolicy Bypass -File "D:\full path\to\script.ps1"
删除到命令提示符并执行完整命令会立即显示问题:
D:\>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File 'D:\full path\to\script.ps1'
Processing -File ''D:\full path\to' failed: The given path's format is not supported. Specify a valid path for the -File parameter.
注意在路径之前使用两个单引号和在之后使用一个单引号。
故事的寓意:当将脚本的完整路径作为命令行参数提供给PowerShell时,使用双引号!
答案 1 :(得分:3)
我收到了同样的错误,最终我遇到了另一个问题 - 目录设置中的可选启动未应用。
基本上,我运行的是.bat文件--c:\ tasks \ process.bat
这个.bat文件引用了tasks目录中的多个ps1脚本,引用只是按文件名(不是完整目录)。在任务计划程序的操作选项卡上,有一个我没有填充的Start in(可选)字段。将其设置为c:\ tasks允许引用正常运行。
答案 2 :(得分:0)
首先,您必须检查计算机上配置的“ExecutionPolicy”。为此,请按照此链接https://technet.microsoft.com/en-us/library/hh847748.aspx
检查默认值我使用此命令修复了我的问题: 在“添加参数”选项中,我把:
“ - Executionpolicy Bypass -command”& 'T:\ deleteOldMessages.ps1'“
和