【问题标题】:How to schedule a task to run when shutting down windows如何安排任务在关闭 Windows 时运行
【发布时间】:2010-09-11 05:26:48
【问题描述】:

如何在 Windows XP 中安排任务在您关闭 Windows 时运行。这样我就想在每次关闭 Windows 时运行一个我用 c# 编写的简单命令行程序。当我的计算机关闭时,计划任务中似乎没有执行此任务的选项。

【问题讨论】:

    标签: windows windows-xp


    【解决方案1】:

    执行 gpedit.msc(本地策略)

    计算机配置 -> Windows 设置 -> 脚本 -> 关机 -> 属性 -> 添加

    【讨论】:

    • 如果您希望在注销时运行批处理脚本,我发现直接引用 .bat 文件不起作用。但是,如果我使用 C:\Windows\System32\cmd.exe 作为 脚本名称 并使用 /C C:\path\to\batch\script.bat 作为 脚本参数,它确实如此。
    • 警告:使用 fastboot 时,组策略启动和关闭 scipts 未执行(在 Windows 8 及更高版本中默认启用)。在这种情况下,只有重新启动或强制关机(从命令提示符处)才能真正关闭计算机。在所有其他情况下(开始菜单关闭),计算机内核休眠并在启动时恢复,GPO 启动和关闭脚本被忽略。
    • @voji:Windows Server 也是这样吗?
    • 重启怎么样?
    • 这些似乎根本无法在 Server Core 1909 上运行
    【解决方案2】:

    除了 Dan Williams 的回答之外,如果您想添加 启动/关闭 脚本,您需要在 计算机配置 下查找 Windows 设置。如果您想添加 Logon/Logoff 脚本,您需要在 User Configuration 下查找 Windows 设置。

    因此,重申一下 Dan 所说的包含这些信息的内容,

    启动/关闭:

    1. 运行 gpedit.msc(本地策略)
    2. 计算机 配置 -> Windows 设置 -> 脚本 -> 启动关闭 -> 属性 -> 添加

    登录/注销:

    1. 运行 gpedit.msc(本地策略)
    2. 用户 配置 -> Windows 设置 -> 脚本 -> 登录注销 -> 属性 -> 添加

    来源:http://technet.microsoft.com/en-us/library/cc739591(WS.10).aspx

    【讨论】:

    • 这是更好的答案。当您打开 GPEditor 时,它会按照您的描述显示两个节点。由于两个节点都有 Windows 设置选项,因此接受的答案不如您的答案清楚。谢谢你的提示。很有帮助。
    • 但是关闭是否也算作注销(并运行注销脚本)?
    【解决方案3】:

    对于喜欢使用任务计划程序的用户,可以通过将任务设置为在事件查看器的系统日志中的事件 1074 被记录后运行来安排任务在启动/关闭启动后运行。 但是,它只适用于非常短的任务,只要系统重新启动/关闭,它就会运行,通常只有几秒钟。

    • 来自任务计划程序:

      开始任务:在一个事件上
      日志:系统
      来源:USER32
      事件ID:1074

    • 从命令提示符:

      schtasks /create /tn "taskname" /tr "task file" /sc onevent /ec system /mo *[system/eventid=1074]

    注释:/ec 选项在 Windows Vista 及更高版本中可用。 (谢谢@t2d)

    请注意,任务状态可以是:

    由于用户尚未登录网络,请求的操作未执行。指定的服务不存在。 (0x800704DD)

    但是,这并不意味着它没有运行。

    【讨论】:

    • 感谢您的提示! @Oz,这会在重启和关机时运行吗?我要介绍的情况是 Windows 更新强制重启...
    • 是的,因为这个事件是在重启/关机时记录的。
    • 请注意,参数/ec system 不存在,但它被称为/ru system。见support.microsoft.com/en-us/kb/814596#bookmark-4
    • @t2d,虽然 /ec 存在于较新的版本中,但 /ru 指的是完全不同的东西。 EC 允许您指定事件通道,而 ru 允许您以另一个用户身份运行。尽管如此,还是感谢您的评论。我会相应地编辑我的帖子。
    • 您的示例中的修饰符有错字。应该是... /mo *[system/eventid=1074],而不是.../mo *[system/evendid=1074]
    【解决方案4】:

    一种解决方法可能是编写一个简单的批处理文件来运行程序,然后关闭计算机。

    您可以从命令行关闭——因此您的脚本可以相当简单:

    c:\directory\myProgram.exe
    C:\WINDOWS\system32\shutdown.exe -s -f -t 0
    

    【讨论】:

      【解决方案5】:

      如果您运行 GPEdit.MSC,您可以转到计算机配置 -> Windows 设置 -> 脚本,然后添加启动/关闭脚本。这些可以是简单的批处理文件,甚至是完整的 EXE。您还可以在同一工具中调整登录和注销脚本的用户配置。此工具在 WIndows XP Home 中不可用。

      【讨论】:

        【解决方案6】:

        上面的帖子中没有提到组策略编辑器。我已经多次使用 GPedit 在启动或关闭时执行任务。以下是 Microsoft 关于如何访问和操作 GPedit 的说明。

        How To Use the Group Policy Editor to Manage Local Computer Policy in Windows XP

        【讨论】:

          【解决方案7】:

          我可以建议做的是创建 .bat 文件的快捷方式(例如在您的桌面上),当您想要关闭计算机(并运行 .bat 文件)时,单击您创建的快捷方式。完成此操作后,编辑 .bat 文件并将这行代码添加到末尾或需要的地方:

          c:\windows\system32\shutdown -s -f -t 00
          

          这是干什么的

          1. 运行关机进程
          2. 显示警报
          3. 强制所有正在运行的进程停止
          4. 立即执行

          【讨论】:

            【解决方案8】:

            我在superuser 上也发布了这个答案。


            为此,您需要在任务计划程序中设置自定义事件过滤器。

            触发器 > 新建 > 自定义 > 编辑事件 > XML

            并粘贴以下内容:

            <QueryList>
              <Query Id="0" Path="System">
                <Select Path="System">
                *[System[Provider[@Name='User32'] and (Level=4 or Level=0) and (EventID=1074)]]
               and 
                 *[EventData[Data[@Name='param5'] and (Data='power off')]]
                </Select>
              </Query>
            </QueryList>
            

            这将仅过滤掉 power off 事件。

            如果您查看事件查看器,您可以在 详细信息选项卡>XML 视图 下的 Windows 日志 > 系统 下看到有这个。

            - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
            - <System>
              <Provider Name="User32" Guid="{xxxxx-xxxxxxxxxxx-xxxxxxxxxxxxxx-x-x}" EventSourceName="User32" /> 
              <EventID Qualifiers="32768">1074</EventID> 
              <Version>0</Version> 
              <Level>4</Level> 
              <Task>0</Task> 
              <Opcode>0</Opcode> 
              <Keywords>0x8080000000000000</Keywords> 
              <TimeCreated SystemTime="2021-01-19T18:23:32.6133523Z" /> 
              <EventRecordID>26696</EventRecordID> 
              <Correlation /> 
              <Execution ProcessID="1056" ThreadID="11288" /> 
              <Channel>System</Channel> 
              <Computer>DESKTOP-REDACTED</Computer> 
              <Security UserID="x-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxx" /> 
              </System>
            - <EventData>
              <Data Name="param1">Explorer.EXE</Data> 
              <Data Name="param2">DESKTOP-REDACTED</Data> 
              <Data Name="param3">Other (Unplanned)</Data> 
              <Data Name="param4">0x0</Data> 
              <Data Name="param5">power off</Data> 
              <Data Name="param6" /> 
              <Data Name="param7">DESKTOP-REDACTED\username</Data> 
              </EventData>
              </Event>
            

            您可以通过点击在事件查看器中使用上面的查询列表代码测试查询

            创建自定义视图...> XML > 手动编辑查询

            粘贴代码,在任务计划程序中尝试之前为其命名仅关闭事件

            【讨论】:

              【解决方案9】:

              您可以运行一个批处理文件来调用您的程序,请查看此处的讨论以了解如何执行此操作: http://www.pcworld.com/article/115628/windows_tips_make_windows_start_and_stop_the_way_you_want.html

              (来自谷歌搜索:Windows 计划任务在关机时运行)

              【讨论】:

                【解决方案10】:

                在Windows 10 Pro上,可以注册批处理文件;不需要注册 cmd.exe 并将 bat 文件指定为参数的解决方法。我只是这样做了,注册了一个关闭脚本和一个启动(引导)脚本,并且成功了。

                【讨论】:

                  【解决方案11】:

                  我还必须启用“指定组策略脚本的最长等待时间”和“在运行时在关闭脚本中显示指令”,以便在我解释 here 时使其对我有用。

                  【讨论】:

                    猜你喜欢
                    • 2011-04-23
                    • 2016-03-05
                    • 1970-01-01
                    • 2012-06-17
                    • 2020-09-21
                    • 1970-01-01
                    • 2017-01-20
                    • 2012-09-18
                    相关资源
                    最近更新 更多