如何在系统关闭时使用 PowerShell 运行一些代码?

问题描述

我正在配置一个 Windows VM,它在启动时需要运行一些 PowerShell 代码。它还需要在关闭时运行一些不同的代码

为了实现前者,我可以在初始配置脚本中使用 New-JobTriggerRegister-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。通过创建一个 任务使用它来触发脚本,它将启动脚本并 让它完成

请注意,这不会延迟关闭(因此必须快速),有时可能无法在任务计划程序服务停止之前触发。


最后说明:

始终确保您的代码可以处理脏关机。毕竟,调用重启最快的方法是电源按钮...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...