退出脚本(关机、重启等)本地和远程

Exit script (Shutdown, Restart, etc) Local and Remote

我一直在尝试两种不同的方法来完成脚本。我需要根据用户需要提供不同的方式来完成脚本,例如注销、重启和关机。我尝试了两种方法,一种是基于 Shutdown.exe 的方法,另一种是 Get-WmiObject 方法。像这样...

Shutdown.exe -r -t 0

(Get-WmiObject win32_operatingsystem -nameSpace:'root\CIMV2' -computerName:'.').Win32Shutdown(2) > $null

问题在于,在不同的情况下,每种方法都有效或无效。前一种方法适用于我的 Windows 家用计算机,而后者因 "Privilege not held" 错误而失败。另一方面,上周在一系列 Windows 7 台机器上,前者什么也没做,后者工作正常。我希望有人可以验证这是否确实是 Home vs Pro 的事情,或者是否还有其他事情在起作用? 为了增加问题的复杂性,我还需要能够 运行 将脚本作为远程作业,理想情况下不需要替代方法。 这里有一些全球解决方案吗?或者我是否需要走丑陋的路线,同时使用两者,相信两者之一在任何情况下都能正常工作?

编辑:根据 Tony 的评论,我现在在开关中使用此变体。

try {
   (Get-WmiObject win32_operatingsystem -nameSpace:'root\CIMV2' -computerName:'.').Win32Shutdown(1) > $null
} catch {
   Shutdown.exe /s /t 0
}

对于关闭或重启计算机的脚本命令,我强烈建议您使用不止一种方法,除非您有一个严格控制的异构环境,在该环境中您可以彻底测试一种方法直到您放心,它将是可靠的。

虽然发出两三个不同的关机命令可能会被考虑 "messy,"IT 有时很混乱,不是吗?我知道做这样的事情会让你感觉很脏,但请放心,几周后你就会忘记它,它不会再像一个不必要的巨型食人魔一样出现在你的噩梦中 运行您计算机上的命令。 :)

这只是我的经验,因此没有可引用的文档。如果有一些评论有令人信服的相反论点,或者有更好的答案,我很乐意删除这个答案。