【问题标题】:How to use PowerShell to run some code upon system shutdown?如何在系统关闭时使用 PowerShell 运行一些代码?
【发布时间】:2021-04-13 19:13:07
【问题描述】:

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

要执行前者,我可以在我的初始配置脚本中使用 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 计划关闭之前使用 PowerShell 运行一些代码(不管它是如何获得命令的)? 它不需要是脚本块,它可以是单独的脚本文件。

【问题讨论】:

    标签: windows powershell shutdown taskscheduler


    【解决方案1】:

    有两种合理的方法可以做到这一点:

    本地组策略:

    这可以在本地组策略编辑器中完成:gpedit.msc。导航到Computer Configuration/Windows Settings/Scripts (Startup/Shutdown)/Shutdown。您可以在此处添加“脚本”和/或“PowerShell 脚本”,它们会在其他关机进程之前执行。


    基于事件的计划任务:

    来自this answer

    计划任务如下:

    • 类型:事件(基本)
    • 日志:系统
    • 来源:User32
    • 事件ID:1074

    当用户或命令以登录身份启动关闭或重新启动时 用户或代表用户,将触发事件 ID 1074。通过创建一个 任务使用它来触发脚本,它将启动脚本并 让它完成

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


    最后说明:

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

    【讨论】:

    • 刚刚也遇到了那个帖子。可以做的是中止关机,运行任务的其余部分,然后添加关机。
    • 可以在 PowerShell 中更改本地组策略(或至少在普通 CMD 中)吗?这必须在配置脚本中设置,所以 GUI 是不行的。
    • @JesseTG 哎呀,错过了它是在配置脚本中完成的 - 本地组策略只是解析为注册表项,所以这很容易。看起来这些应该就是你所需要的:serverfault.com/a/900093/411612
    • 谢谢。我将彻底阅读该线程,看看它是否符合我的需要。 (我不知道注册表是如何工作的。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多