Powershell脚本在Powershell中工作,但在Task Scheduler中失败

sha*_*651 3 smtp powershell-2.0

我有一个PowerShell脚本,通过SMTP发送电子邮件.该脚本在Powershell ISE中运行良好,但在任务计划程序中失败.我在Windows Server 2012上.我使用完全相同的设置在此服务器上运行其他Powershell脚本,但这些脚本不发送电子邮件.我在任务计划程序中看到的返回码是(0xFFFD0000),我找不到任何关于此的信息.我将任务设置为以最高权限运行,并且我已检查executionpolicy是否为RemoteSigned.以前有人碰到这个吗?

这是任务中的命令:

powershell -f "c:\scripts\EmailTest.ps1"
Run Code Online (Sandbox Code Playgroud)

这是脚本:

$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)
Run Code Online (Sandbox Code Playgroud)

更新:我能够解决问题.显然,我在脚本中添加了一行注释掉的内容.我不确定为什么这会导致错误但是一旦我删除了注释掉的行,它在任务调度程序中运行正常.注释看起来像这样,就在上面脚本中的其他$ EmailTo声明之下:

#$EmailTo = "someone@somewhere.com"
Run Code Online (Sandbox Code Playgroud)

小智 7

在查看类似问题时,我发现了另一个可能的问题.我无法将PowerShell脚本作为任务计划程序操作执行,即使在作为目标用户登录Windows并在PowerShell中运行时脚本正确运行.

当我使用我认为正常的PowerShell引用规则在任务的操作参数中指定脚本时,任务计划程序将始终显示0xFFFD0000错误:

-ExecutionPolicy Bypass -File 'D:\full path\to\script.ps1'
Run Code Online (Sandbox Code Playgroud)

PowerShell默认并且任务计划程序立即启动任务,当我更改从单用户到双用的引号时没有问题:

-ExecutionPolicy Bypass -File "D:\full path\to\script.ps1"
Run Code Online (Sandbox Code Playgroud)

删除到命令提示符并执行完整命令会立即显示问题:

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.
Run Code Online (Sandbox Code Playgroud)

请注意在路径之前使用两个单引号并在之后使用一个单引号.

故事的寓意:当将脚本的完整路径作为命令行参数提供给PowerShell时,请使用双引号!


小智 5

我收到了同样的错误,最终我遇到了一个不同的问题 - 未应用目录设置中的可选启动。

本质上,我正在运行一个 .bat 文件 - c:\tasks\process.bat

这个 .bat 文件引用了任务目录中的多个 ps1 脚本,引用只是文件名(不是完整目录)。在任务计划程序的操作选项卡上,有一个我没有填充的开始(可选)字段。将其设置为 c:\tasks 允许引用正常运行。