我正在配置一个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运行某些代码(无论它是如何获得命令的)?
它不需要是一个脚本块,它可以是一个单独的脚本文件。
1条答案
按热度按时间kxkpmulp1#
有两种合理的方法可以做到这一点:
本地组策略:
这可以在本地组策略编辑器中完成:
gpedit.msc
。导航到Computer Configuration/Windows Settings/Scripts (Startup/Shutdown)/Shutdown
。您可以在此处添加“关闭”和/或“PowerShell关闭”,它们会在其他关闭进程之前执行。基于事件的定时任务:
从this answer开始:
计划任务如下:
当用户或命令以登录用户或代表用户的身份启动关机或重新启动时,将触发事件ID 1074。通过创建一个任务来使用此触发脚本,它将启动脚本并允许其完成
请注意,这不会延迟关闭(因此必须快速),并且有时可能无法在任务计划程序服务停止之前触发。
最后备注:
始终确保您的代码可以处理脏关机。毕竟,调用重新启动的最快方法是电源按钮。