Schtasks – 下面的命令有什么问题

以下脚本安排成功,但实际上不会重新启动服务器。

schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell -command {Restart-Computer -ComputerName server01 -force -wait Send-MailMessage -From [email protected] -To [email protected] -Subject 'Rebooted' -SmtpServer smtp.domain.com}"

任务计划程序事件日志显示任务成功完成:

Task Scheduler successfully completed task "\restart test" , instance "{4a8b0e75-eb2f-4be6-918d-7b66473dd344}" , action "C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.EXE" with return code 0.

如果我只运行{...}的命令,它将重新启动服务器并发送通知电子邮件。

我错过了什么?

编辑:我正在执行此从Windows 7笔记本电脑与PowerShell 3.0到Windows 2012服务器

好的,我删除了我以前的评论,并将我的意见转化为一个答案,因为起初我的评论只是作为一般性build议开始的,但是他们变成了一个确切的答案。

所以我testing了Win7和PS3,所以我使用了和你一样的平台。

首先,从命令中删除-Command { ... } ,我的意思是:

 schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell Restart-Computer -ComputerName server01 -force -wait" 

这样可行。 但是你的下一个问题是你想要执行多个命令(1重新启动计算机并发送一封电子邮件),为此,我build议将这些命令放在一个ps1脚本文件中,而不是像下面这样完成任务:

 schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell C:\Scripts\restartAndEmail.ps1" 

我并不是说你不能从技术上得到两个Powershell命令来一次调用schtasks,但是它很笨拙,你必须开始担心需要在命令行上转义的字符,例如| 字符等等,从几乎所有的angular度来看,它只是简单地使用一个ps1文件。

指定脚本的标准path非常重要。 计划任务的当前工作目录可能与脚本path不一致,所以相对path不会剪切。

实际上,当我为Powershell脚本进行计划任务时,我通常也包括Powershell exe的完整path,只是为了确保。 那些我们已经在这里演示的,你不必在这种情况下包括Powershell.exe的完全合格的path。

看起来像/tr没有正确parsing命令和参数,似乎没有一个可靠的方式使用schtasks.exe将parameter passing给命令。 相反,把PowerShell -command {...}东西放在一个batch file(或一个* .ps1文件也许),并从任务调用它,例如

 schtasks /create ... /tr "RestartAndSendEmail.cmd"