Windows自動定時執行任務,常見的方法有三種:
- Windows 任務計划程序
- Windows Service
- 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 必須使用程序集的版本、區域性和公鑰標記完全限定程序集名稱
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 ]:
yQUERY 和 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. 這個只適用於數據庫方面的數據定時更新,定時發送郵件,等等與數據庫相關任務,但是牽涉到桌面應用方面的可能就無能為力了,這里不再多介紹了!
總而言之,使用何種方法來實現任務的定時的按計划執行 ,需要根據具體的情況來定:
- 僅僅與數據庫相關的,用SQL Agent
- 不需要考慮太多靈活性和擴展性的,用Windows 任務計划程序
- 靈活度高,需要考慮擴展應用(必須添加Job,按照自定義方式執行Job,... ...),那我們可以選擇Windows Service
接下來的文章,我會用一個比較簡單的例子,介紹如何構建,部署Windows Service!
Windows有個創建定時任務的命令:SCHTASKS
其具體命令格式如下:
- SCHTASKS /parameter [arguments]
- 描述:
- 允許管理員創建、刪除、查詢、更改、運行和中止本地或遠程系統上的計划任
- 務。
- 參數列表:
- /Create 創建新計划任務。
- /Delete 刪除計划任務。
- /Query 顯示所有計划任務。
- /Change 更改計划任務屬性。
- /Run 按需運行計划任務。
- /End 中止當前正在運行的計划任務。
- /ShowSid 顯示與計划的任務名稱相應的安全標識符。
- /? 顯示此幫助消息。
- Examples:
- SCHTASKS
- SCHTASKS /?
- SCHTASKS /Run /?
- SCHTASKS /End /?
- SCHTASKS /Create /?
- SCHTASKS /Delete /?
- SCHTASKS /Query /?
- SCHTASKS /Change /?
我這里以定時運行task.bat批處理文件為例,task.bat內容如下:
- notepad
這里為了演示方便,task.bat文件中就notepad一句語句,目的是讓其定時運行記事本程序。
接下來創建定時任務的批處理文件createtask.bat,其內容如下:
- set base_dir=%~dp0
- %base_dir:~0,2%
- 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.點擊“完成”
二.修改配置,我們回到“任務計划窗口”,就可以看到剛才定制的任務了。如果我們在設置過程中,任務運行時間設置的還不是很詳細,我們可以在當前窗口下,右鍵點擊任務名稱,選擇屬性,里面的“計划”面板有個高級,可以到那里面更詳細的設置。
三.刪除該任務就是右鍵點擊選擇刪除了。