Schtasks——以下命令有什么问题

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.

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

我错过了什么?

编辑:我正在从装有 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"

相关内容