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改成絕對路徑。