Batch Script to Install or Uninstall a .NET Windows Service

來源:互聯網
上載者:User

Windows批次檔,批次檔的副檔名為.bat或.cmd。在命令列提示下鍵入批次檔的名稱,或者雙擊批次檔,系統就會調用Cmd.exe按照該批次檔中各個命令的順序依次執行。

1.
運行Cmd
鍵入命令: echo Hello World
結果:Hello World

可見echo是輸出命令,相當於Console.WriteLine("Hello World")

2.
HelloWorld.bat
echo Hello World

雙擊運行
結果:一閃而過,因為我們的命令被執行結束,所以就直接被退出了。
加個pause命令表示暫停。

3.
HelloWorld.bat
echo Hello World
pause

結果:
echo Hello World
Hello World
請按任意鍵結束 (後面我都省略)

預設Cmd.exe每讀取一條命令都會將其顯示出來,所以我們所執行的使命echo Hello World也被顯示出來了。(稱為回顯)
有的時候我們並不想讓使用者知道我們執行了哪些命令,那我們可以關閉回顯。

4.
HelloWorld.bat
@echo Hello World
pause

雙擊運行
結果:
Hello World

說明@可以關閉當前命令的回顯,那要是有100條命令,每個命令前都加上,不死人才怪。

5.
HelloWorld.bat
@echo off
echo Hello World
echo Hello World
pause

雙擊運行
結果:
Hello World
Hello World

說明@echo off可以為所有命令關閉回顯

-------------------------------------------------------------- 下面將用到的批命令介紹結束

建立一個Windows Service項目,添加HelloWorldService

Program.cs代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace HelloWorld
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            ServiceBase[] services = new ServiceBase[] {
                new HelloWorldService()                 
            };
            ServiceBase.Run(services);
        }
    }
}

使用System.ServiceProcess下的ServiceBase運行我們需要在Windows上跑的Service

HelloWorldService.cs代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

using System.IO;
using System.Threading;

namespace HelloWorld
{
    public partial class HelloWorldService : ServiceBase
    {
        public HelloWorldService()
        {
            InitializeComponent();
        }

        private Thread thread;

        protected override void OnStart(string[] args)
        {
            Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
            Log("Start HelloWorldService");

            thread = new Thread(new ThreadStart(Run));
            thread.Priority = ThreadPriority.Normal;
            thread.Start();
        }

        private static void Run()
        {
            while (true)
            {
                Log(DateTime.Now.ToString());
                Thread.Sleep(1000);
            }
        }

        protected override void OnStop()
        {
            Log("Stop HelloWorldService");
        }

        private static void Log(string message)
        {
            string path = string.Format(@"{0}\{1}.txt",
                Directory.GetCurrentDirectory(),
                DateTime.Today.ToString("yyyy-MM-dd"));

            using (StreamWriter streamWriter = new StreamWriter(path, true))
            {
                streamWriter.WriteLine(message);
            }
        }
    }
}

Service必須繼承至System.ServiceProcess下的ServiceBase,Windows Service中使用AppDomain.CurrentDomain.BaseDirectory、Directory.GetCurrentDirectory()等預設都會被跳到C:\Windows\System32目錄中,所以我們需要在OnStart中設定一下CurrentDirectory。

-------------------------------------------------------------- 批次檔
Install.bat

@echo off
echo install start....
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe /i HelloWorld.exe
Net Start "HelloWorldService"
pause

這裡 /i 表示安裝HelloWorld.exe這個程式,Net Start表示啟動HelloWorldService

Uninstall.bat
@echo off
echo uninstall start....
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe /u MailSender.exe
pause

這裡 /u 表示卸載HelloWorld.exe這個程式,Net Stop就不用了,都被卸載是不。

-------------------------------------------------------------- 可能出現的問題
1. 無法安裝,提示RunInstaller(true)...
原因,未提供安裝包,在HelloWorldService的設計器上右鍵Add Installer,會產生一個ProjectInstaller.cs檔案

2. 開啟ProjectInstaller.cs設計器
預設HelloWorldService的安裝執行個體helloWorldServiceInstaller和serviceProcessInstaller會被加入,名字自己取。。。

3. helloWorldServiceInstaller配置StartType為Automatic這會為自動啟動,比較方便。

4. 預設啟動該服務,會彈出使用者登入框,需要驗證。
將serviceProcessInstaller的Account設定為LocalSystem

--------------------------------------------------------------- Windows7下可能出現的問題
直接雙擊Instal.bat這個批次檔,會提示System.Security.SecurityException,提示建立EventLog時拋出(安全異常,通常由許可權不夠導致)
說明當我們運行這個批次檔時,由於無建立EventLog的許可權導致了這個異常。

HelloWorldService中並沒有建立EventLog的代碼,所以可能的問題應該在ServiceBase中。
查看ServiceBase發現使用了EventLog相關代碼,我們可以在事件檢視器中看到相關的資訊。在Windows7下,非管理員無此許可權。
我們已經自己使用了Log,所以EventLog已經沒有必要了。可以設定AutoLog為false不進行Log。(不過設定了,結果還是一樣,還是會進行建立EventLog,不知道如何關掉,鬱悶。)

這個方法行不通只能使用以管理員的方式執行批次檔了,然後把批次檔中的HelloWorld.exe改成絕對路徑。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.