![Schtasks——以下命令有什么问题](https://linux22.com/image/618067/Schtasks%E2%80%94%E2%80%94%E4%BB%A5%E4%B8%8B%E5%91%BD%E4%BB%A4%E6%9C%89%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98.png)
以下脚本调度成功但实际上不会重新启动服务器。
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 执行此操作
答案1
好的,我正在删除我之前的评论,并将我的评论移到答案中,因为起初我的评论只是一般性建议,但它们变成了带有确切答案的详尽澄清。
所以我用 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 重新启动计算机和 2 发送电子邮件),为此我建议将命令放在 ps1 脚本文件中,并改为执行如下任务:
schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell C:\Scripts\restartAndEmail.ps1"
我不是说你不能从技术上讲,在一次 schtasks 调用中就可以运行两个 Powershell 命令,但是它很笨重,而且您必须开始担心需要在命令行上转义的字符,例如字符|
等,而从几乎每个角度来看,使用 ps1 文件都会变得更容易。
指定脚本的完整路径非常重要。计划任务的当前工作目录可能不是与脚本的路径相同,因此相对路径不会被剪切。
事实上,当我为 Powershell 脚本制定计划任务时,我通常也会包含 Powershell exe 的完整路径,以确保万无一失。我们已经在此处演示了,在这种情况下,您不必包含 Powershell.exe 的完整路径。
答案2
看起来/tr
没有正确解析命令和参数,而且似乎没有可靠的方法使用 schtasks.exe 将参数传递给命令。相反,将内容放入PowerShell -command {...}
批处理文件(或可能是 *.ps1 文件)并从任务中调用它,例如
schtasks /create ... /tr "RestartAndSendEmail.cmd"