以下脚本计划成功,但实际上不会重新启动服务器。
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.
如果我只运行 中的命令{...}
,它将重新启动服务器并发送通知电子邮件。
我错过了什么?
编辑:我正在从带有 PowerShell 3.0 的 Windows 7 笔记本电脑到 Windows 2012 Server 执行此操作
看起来
/tr
没有正确解析命令和参数,并且似乎没有一种可靠的方法可以使用 schtasks.exe 将参数传递给命令。而是将这些PowerShell -command {...}
东西放在一个批处理文件(或者可能是 *.ps1 文件)中并从任务中调用它,例如好的,我正在删除我之前的评论,并将我的评论转移到一个答案中,因为起初我的评论只是一般性的建议,但它们变成了一个准确答案的重度澄清。
所以我用Win7和PS3进行了测试,所以我使用的是和你一样的平台。
首先,只需
-Command { ... }
从您的命令中删除,我的意思是:这样可行。但是您的下一个问题是您要执行多个命令(1 重新启动计算机并 2 发送电子邮件),为此我建议将命令放在 ps1 脚本文件中,而不是像这样执行任务:
我并不是说从技术上讲你不能在一次调用 schtasks 时运行两个 Powershell 命令,但它很笨拙,你必须开始担心需要在命令行上转义的字符,例如
|
字符等。 ,从几乎每个角度来看,只使用 ps1 文件就变得更容易了。指定脚本的完全限定路径很重要。计划任务的当前工作目录可能与脚本的路径不同,因此相对路径不会剪切它。
事实上,当我为 Powershell 脚本制定计划任务时,我通常也会包含 Powershell exe 的完整路径,以确保这一点。我们已经在这里演示过,在这种情况下,您不必包含 Powershell.exe 的完全限定路径。