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:\Windows\Microsoft.NET\Framework\version\ 下。

   使用方法: 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 plain copy
 
 
 
 
  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 plain copy
 
 
 
 
  1. notepad  

 

這里為了演示方便,task.bat文件中就notepad一句語句,目的是讓其定時運行記事本程序。

接下來創建定時任務的批處理文件createtask.bat,其內容如下:

 

[java]  view plain copy
 
 
 
 
  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.點擊“完成”

二.修改配置,我們回到“任務計划窗口”,就可以看到剛才定制的任務了。如果我們在設置過程中,任務運行時間設置的還不是很詳細,我們可以在當前窗口下,右鍵點擊任務名稱,選擇屬性,里面的“計划”面板有個高級,可以到那里面更詳細的設置。

三.刪除該任務就是右鍵點擊選擇刪除了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM