zoukankan      html  css  js  c++  java
  • Windows 自动定时执行任务的方法

      Windows自动定时执行任务,常见的方法有三种:

    1. Windows 任务计划程序
    2. Windows Service
    3. SQL Agent 的 Job   

         这三种方法大多数人都用过,我在这里只做一个比较简单的介绍和小结,后续,我会用一个轻量型的.Net Windows Service Jobs的作为例子介绍如何定制Windows Service以及如何让Windows Service 自动定时执行任务。

        首先,我们来看:使用 Windows 任务计划程序 如何创建自动定时执行任务:

        界面方式: 计算机(右键)->管理 ,然后就可以打开 “计算机管理”界面,在界面的左侧有一个 系统工具->任务计划程序 ,在此我们可以创建定时执行的计划任务,并且可以为每个任务添加触发器和具体的操作。

        ; 

         具体的使用方法应该很简单,这里就不再一一介绍。

         CMD 命令行方式: 主要命令是 SchTasks (另外还有 AT命令,该命令用来调用或者执行已经存在于Task Schedule列表中的Task). 命令行形式可以用于制作安装和部署包。如果用界面方式的话,安装和部署都不太方便。

         SchTasks /?:  查看 SchTasks命令,  

    SCHTASKS /parameter [arguments]

    描述:
        允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任
        务。

    参数列表:
        /Create         创建新计划任务。

        /Delete         删除计划任务。

        /Query          显示所有计划任务。

        /Change         更改计划任务属性。

        /Run            按需运行计划任务。

        /End            中止当前正在运行的计划任务。

        /ShowSid        显示与计划的任务名称相应的安全标识符。

        /?              显示此帮助消息

         Windows 任务计划程序需要:具体的任务执行程序(exe,批处理);而通过设置,让Windows来控制具体的执行的具体时间,重复度,触发条件,等。我们可以控制的是 具体的任务执行程序。 当然如果我们将什么时候定时执行任务,以及如何重复执行,触发条件等都写在程序里,也未尝不可,但是这样的话,就抹杀了Windows任务计划程序的特有功能了!!

        接下来,我们来看一下,Windows Service 如何解决自动定时执行任务。

        利用Windows Service 解决自动定时执行任务的方案是,制作一个Windows Service程序,在Service内部部署好具体的任务程序,以及控制任务什么时候执行,如何重复,等等。他的可控性和自定义空间相比任务计划程序大,但是自己的工作量相对而言就大一些。

        有关如何制作Windows Service程序,我在下篇文章中会介绍,这里只介绍如何部署和卸载。

        部署Windows Service只能通过命令行形式来部署。但是具体的命令有两种: InstallUtil 和 sc

        (也可以在Windows Service的Program启动点中添加自定义的Installer和启动参数来实现不用InstallUtil和sc来安装和卸载,最后还是要通过命令行形式输入运行参数来安装,这个我会在后续的文章中详解如何在Windows Service中添加启动参数和自定义Installer) 

       InstallUtil.exe是.NetFramework自带的工具,一般他的路径在 C:WindowsMicrosoft.NETFrameworkversion 下。

       使用方法: installutil [/uninstall][option [...]]assemblyname

       其中 assemblyname 必须使用程序集的版本、区域性和公钥标记完全限定程序集名称

       详情请见InstallUtil.exe (MSDN)

       SC 是系统自带的命令,不需要.Net Framework(当然如果希望运行C#程序,.Net Framework是必须的,所以一般情况下我们都可以用InstallUtil命令来部署和卸载)。我以前做开发Service时碰到的一个问题是,当我用InstallUtil部署好一个Service,但由于程序更新,需要卸载后重新部署,这个时候,就出现用InstallUitl /u 无法卸载的情况,具体的原因还不太明白,但是MSDN上说明了 InstallUtil 安装的时候是启用事务的,但是卸载的时候不启用事务,会不会是这个原因呢?? 但是,这中情况下,我却可以用 sc delete 命令来卸载。

       有关sc命令的使用方法,sc /?:

    描述:
            SC 是用于与服务控制管理器和服务进行通信的命令行程序。
    用法:
            sc <server> [command] [service name] <option1> <option2>...


            选项 <server> 的格式为 “\servername”

            键入 "sc [command]" 可以获得有关命令的进一步帮助
            命令:
              query-----------查询服务的状态,
                              或枚举服务类型的状态。
              queryex---------查询服务的扩展状态,
                              或枚举服务类型的状态。
              start-----------启动服务。
              pause-----------向服务发送 PAUSE 控制请求。
              interrogate-----向服务发送 INTERROGATE 控制请求。
              continue--------向服务发送 CONTINUE 控制请求。
              stop------------向服务发送 STOP 请求。
              config----------更改服务的配置(永久)。
              description-----更改服务的描述。
              failure---------更改服务失败时执行的操作。
              failureflag-----更改服务的失败操作标志。
              sidtype---------更改服务的服务 SID 类型。
              privs-----------更改服务的所需权限。
              qc--------------查询服务的配置信息。
              qdescription----查询服务的描述。
              qfailure--------查询失败时服务执行的操作。
              qfailureflag----查询服务的失败操作标志。
              qsidtype--------查询服务的服务 SID 类型。
              qprivs----------查询服务的所需权限。
              qtriggerinfo----查询服务的触发器参数。
              qpreferrednode--查询首选的服务 NUMA 节点。
              delete----------(从注册表)删除服务。
              create----------创建服务(将其添加到注册表)。
              control---------向服务发送控制。
              sdshow----------显示服务的安全描述符。
              sdset-----------设置服务的安全描述符。
              showsid---------显示相应于假定名称的 SID 字符串。
              triggerinfo-----配置服务的触发器参数。
              preferrednode---设置首选的服务 NUMA 节点。
              GetDisplayName--获取服务的 DisplayName
              GetKeyName------获取服务的 ServiceKeyName。
              EnumDepend------枚举服务的依存关系。

            下列命令不要求服务名称:
            sc <server> <command> <option>
              boot------------(ok | bad) 指示是否将上一次启动保存为
                              最近一次已知的正确启动配置
              Lock------------锁定服务数据库
              QueryLock-------查询 SCManager 数据库的 LockStatus
    示例:
            sc start MyService

    是否想参阅 QUERY 和 QUERYEX 命令的帮助? [ y | n ]:
    y

    QUERY 和 QUERYEX 选项:
            如果查询命令带服务名称,将返回
            该服务的状态。其他选项不适合这种
            情况。如果查询命令不带参数或
            带下列选项之一,将枚举此服务。
        type=    要枚举的服务的类型(driver, service, all)
                 默认 = service)
        state=   要枚举的服务的状态 (inactive, all)
                 (默认 = active)
        bufsize= 枚举缓冲区的大小(以字节计)
                 (默认 = 4096)
        ri=      开始枚举的恢复索引号
                 (默认 = 0)
        group=   要枚举的服务组
                 (默认 = all groups)

    语法示例
    sc query                - 枚举活动服务和驱动程序的状态
    sc query eventlog       - 显示 eventlog 服务的状态
    sc queryex eventlog     - 显示 eventlog 服务的扩展状态
    sc query type= driver   - 仅枚举活动驱动程序
    sc query type= service  - 仅枚举 Win32 服务
    sc query state= all     - 枚举所有服务和驱动程序
    sc query bufsize= 50    - 枚举缓冲区为 50 字节
    sc query ri= 14         - 枚举时恢复索引 = 14
    sc queryex group= ""    - 枚举不在组内的活动服务
    sc query type= interact - 枚举所有不活动服务
    sc query type= driver group= NDIS     - 枚举所有 NDIS 驱动程序

         上面的用法都是来自系统help, 具体使用很简单,试一试就OK 了。

         Windows Service 是一种完全自定义控制的实现自动定时执行任务的方法,可以自定义的东西很多,灵活性很高,所以使用起来可能会比 Windows 任务计划程序稍微复杂一些,适合灵活度和扩张性要求高的情况。

         最后,我们简单介绍一些 SQL Agent中Job。

        SQL Agent 是  SQL Server的一个服务之一,用之前,我们需要启动 SQL Agent Windows Service. 这个只适用于数据库方面的数据定时更新,定时发送邮件,等等与数据库相关任务,但是牵涉到桌面应用方面的可能就无能为力了,这里不再多介绍了!

         总而言之,使用何种方法来实现任务的定时的按计划执行 ,需要根据具体的情况来定:  

    1. 仅仅与数据库相关的,用SQL Agent
    2. 不需要考虑太多灵活性和扩展性的,用Windows 任务计划程序
    3. 灵活度高,需要考虑扩展应用(必须添加Job,按照自定义方式执行Job,... ...),那我们可以选择Windows Service

       接下来的文章,我会用一个比较简单的例子,介绍如何构建,部署Windows Service!

    Windows有个创建定时任务的命令:SCHTASKS

    其具体命令格式如下:

    [java] view plaincopy
     
     
     
     
    1. SCHTASKS /parameter [arguments]  
    2.   
    3. 描述:  
    4.     允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任  
    5.     务。  
    6.   
    7. 参数列表:  
    8.     /Create         创建新计划任务。  
    9.   
    10.     /Delete         删除计划任务。  
    11.   
    12.     /Query          显示所有计划任务。  
    13.   
    14.     /Change         更改计划任务属性。  
    15.   
    16.     /Run            按需运行计划任务。  
    17.   
    18.     /End            中止当前正在运行的计划任务。  
    19.   
    20.     /ShowSid        显示与计划的任务名称相应的安全标识符。  
    21.   
    22.     /?              显示此帮助消息。  
    23.   
    24. Examples:  
    25.     SCHTASKS  
    26.     SCHTASKS /?  
    27.     SCHTASKS /Run /?  
    28.     SCHTASKS /End /?  
    29.     SCHTASKS /Create /?  
    30.     SCHTASKS /Delete /?  
    31.     SCHTASKS /Query  /?  
    32.     SCHTASKS /Change /?  

    我这里以定时运行task.bat批处理文件为例,task.bat内容如下:

    [java] view plaincopy
     
     
     
     
    1. notepad  

    这里为了演示方便,task.bat文件中就notepad一句语句,目的是让其定时运行记事本程序。

    接下来创建定时任务的批处理文件createtask.bat,其内容如下:

    [java] view plaincopy
     
     
     
     
    1. set base_dir=%~dp0  
    2. %base_dir:~0,2%  
    3. SCHTASKS /Create /TN mytask /SC ONCE /ST 01:15 /TR  %base_dir%task.bat  
      

    这里需要注意一下,在默认情况下,运行批处理文件的当前路径为C:/Windows/System32,也就是cmd.exe的路径,不是我真正运行批处理的当前路径,为了让其正确指向我的task.bat文件,这里需要获取真正运行的批处理的当前路径,代码中前两行就是获取当前路径的方法,当前路径保存在base_dir中。至于SCHTASKS语法,请自行到cmd下查看帮助说明。

    windows 的Schedule Task

    .创建配置

    1.点击“开始”

    2.点击“控制面板”

    3.双击“任务计划”

    4.双击“添加任务计划”

    5.到了“任务计划向导”界面,点击“下一步”

    6.点击“浏览”选择需要定时运行的程序(exe文件,bat文件,com文件,sys文件)然后确定。

    7.给此任务取个名称,也可以默认,并且选择多少时间段运行一次程序,点击“下一步”

    8.选择什么时刻运行,开始运行日期。点击“下一步”

    9.输入用户名,密码,确认密码,这样保证系统定时启动该程序,点击“下一步”

    10.点击“完成”

    二.修改配置,我们回到“任务计划窗口”,就可以看到刚才定制的任务了。如果我们在设置过程中,任务运行时间设置的还不是很详细,我们可以在当前窗口下,右键点击任务名称,选择属性,里面的“计划”面板有个高级,可以到那里面更详细的设置。

    三.删除该任务就是右键点击选择删除了。

  • 相关阅读:
    Maven发布工程到公共库
    js一些代码方法
    我的语录
    java 安装配置时出现的问题
    HDUOJ----4501小明系列故事——买年货(三维背包)
    message 弹出窗口
    2014校招 百度试题及答案
    HDUOJ---1862EXCEL排序
    HDUOJ-----3591The trouble of Xiaoqian
    HDUOJ-----2571跳舞毯
  • 原文地址:https://www.cnblogs.com/klb561/p/11311653.html
Copyright © 2011-2022 走看看