【发布时间】:2017-01-11 11:07:46
【问题描述】:
您好,我有一个始终在后面运行的监控脚本(带有 winforms gui)。 不幸的是,当用户尝试手动关闭计算机时,这会惹恼用户,因为它会引发“此应用正在阻止 Windows 关机”屏幕。
所以我需要一种可靠的方式来在启动关机时自动关闭脚本。
我尝试订阅SessionEnding- 和 SessionEnded-event,但没有成功:
$sysevent = [microsoft.win32.systemevents]
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnding" -Action { Exitfunction }
更新: 目前是这样的:
$sysevent = [microsoft.win32.systemevents]
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnding" -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnded" -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
Register-WmiEvent -Class win32_computerShutdownEvent -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
我添加了一个消息框来查看其中一个事件是否真的会触发,但操作脚本块执行的代码可能有问题。没运气。当我尝试关闭 Windows 8.1 系统时,这些事件都不会发生。 当我使用 get-job 读取事件时,事件内部没有没有错误。所有的状态都是“未开始”。
有什么想法吗?
【问题讨论】:
-
这与我在上面发布的解决方案相同。它不起作用,至少不是每次都起作用。不幸的是,我不能说为什么它不起作用,所以我正在寻找一种替代解决方案,如果有的话。
-
嗯,没有。它不是。链接的帖子包含的代码比您在此处发布的要多得多,并且还包括注册第二个活动。您可能应该更仔细地阅读它。 (它也被接受了,这通常意味着提出问题的用户找到了可行的解决方案。)
-
是的,它有更多代码,但只有在事件成功引发后执行的代码。所以它对任务并不重要。我也尝试了第二个事件,它没有帮助。我将在 OP 中添加它。
标签: powershell events shutdown