1. 程式人生 > >【轉】如何在命令行腳本中啟動帶參數的Windows服務

【轉】如何在命令行腳本中啟動帶參數的Windows服務

服務控制 代碼 需要 () 而不是 gen 備註 詳細介紹 namespace

我們有一個自己編寫的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

【轉】如何在命令行腳本中啟動帶參數的Windows服務