我們有一個自己編寫的Windows服務,我們希望該服務在啟動時可以根據用戶輸入的參數實現不同的功能。
要實現這樣的需求並不是很難,下面這個例子我用來示范如何編寫該服務
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Diagnostics; 6 using System.Linq; 7 using System.ServiceProcess; 8 using System.Text; 9 10 namespace WindowsServiceSample 11 { 12 public partial class SampleService : ServiceBase 13 { 14 public SampleService() 15 { 16 InitializeComponent(); 17 } 18 19 /// <summary> 20 /// 服務啟動時觸發 21 /// </summary> 22 /// <param name="args">用戶可以設置的輸入參數</param> 23 protected override void OnStart(string[] args) 24 { 25 26 if (args.Length > 0) 27 { 28 EventLog.WriteEntry(string.Format("sample service is started with parameter :{0}", string.Join(",", args))); 29 } 30 else 31 { 32 EventLog.WriteEntry("sample service is started with non parameter"); 33 } 34 } 35 36 protected override void OnStop() 37 { 38 } 39 } 40 }
在上述代碼中,我區分了帶參數啟動和不帶參數啟動兩種情況。很顯然,在帶參數的那種情況下,我們可以根據參數做不同的處理。本文僅為了說明參數問題,並不真的去考慮那些實際應用。我通過寫日志的方式來區分即可。
這個服務安裝起來之后,在服務控制台中看起來是這樣的
如果我們通過手工去啟動的話,如何設置參數呢?很簡單,雙擊該服務,在屬性對話框中輸入參數即可
【注意】是先輸入參數,然后點擊“Start”
【注意】不同的參數之間用空格隔開
啟動成功后,我們在事件日志中可以看到一條日志
這說明,參數確實被捕捉到了。服務正常進行了工作。
還不錯對吧?但本文的最大目的並不是解釋這個,上面都是鋪墊,如果我們是要通過命令行腳本的方式來啟動服務,而不是手工啟動服務,那么該如何設置參數呢?
我們都知道要在命令行中啟動服務,一般都是通過net start命令。這個工具的格式如下
我們可以通過net start sampleservice啟動服務
在事件日志中確實看到它是沒有帶參數啟動的
好吧,那么如何傳遞參數過去呢?
經過研究發現,net 工具要傳遞參數的話,有一個很特殊的做法
net start sampleservice /a /b /c /d
但是這樣啟動之后,看日志卻發現有一點點特殊
請主要,參數確實傳遞進來了。但包含了“/”。如果說在程序中識別這個特殊的符號,那么也是沒有問題的。只不過,這樣就未必是增加了程序的復雜性啦。
那么,有沒有更加簡單的做法呢?(簡單的意思是說與手工操作是一樣的,不需要為此去修改代碼)
我想起來,除了用net start之外,還可以通過sc start命令來啟動服務
這樣的命令就直觀多了。我們馬上來看一下日志文件中的結果吧
很好,這是我們需要的效果。也就是說用sc工具的話,可以很好地傳遞參數。
【備注】sc的意思是,service controller,關於該工具的詳細介紹,請參考 http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sc.mspx?mfr=true