问题描述
我正在配置一个 Windows VM,它在启动时需要运行一些 PowerShell 代码。它还需要在关闭时运行一些不同的代码。
为了实现前者,我可以在初始配置脚本中使用 New-JobTrigger
和 Register-ScheduledJob
,如下所示:
$startupTrigger = New-JobTrigger -AtStartup
Register-ScheduledJob -Name "Startup Job" -Trigger $startupTrigger -Credential $DesiredCredentials -ScriptBlock {
Do-InterestingThings $using:ExternalResource
}
甚至不必是一个单独的脚本文件,它可以是一个 script block。来自外部作用域的任何变量都将在作业运行时被序列化和使用。很整洁。
我要解决的真正问题是创建一个外部资源,其生命周期与 VM 的正常运行时间相关。创建 VM 时,将创建此资源。当 VM 关闭时,需要清理此资源。 如何在 VM 计划关闭之前使用 PowerShell 运行一些代码(无论它是如何获得命令的)?它不需要是脚本块,它可以是一个单独的脚本文件。
解决方法
有两种合理的方法可以做到这一点:
本地组策略:
这可以在本地组策略编辑器中完成:gpedit.msc
。导航到 Computer Configuration/Windows Settings/Scripts (Startup/Shutdown)/Shutdown
。您可以在此处添加“脚本”和/或“PowerShell 脚本”,它们会在其他关闭进程之前执行。
基于事件的计划任务:
来自this answer:
预定任务如下:
- 类型:事件(基本)
- 日志:系统
- 来源:User32
- 事件 ID:1074
当用户或命令以登录身份启动关机或重启时 用户或代表用户,将触发事件 ID 1074。通过创建一个 任务使用它来触发脚本,它将启动脚本并 让它完成
请注意,这不会延迟关闭(因此必须快速),有时可能无法在任务计划程序服务停止之前触发。
最后说明:
始终确保您的代码可以处理脏关机。毕竟,调用重启最快的方法是电源按钮...