yz_server/Server/Utils/ServiceInstaller.cs

120 lines
3.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Diagnostics;
namespace Server.Utils
{
/// <summary>
/// 安装Windows服务业务层
/// </summary>
public class ServiceInstaller
{
public static ServiceController GetServiceController(string serviceName)
{
ServiceController[] controllers = ServiceController.GetServices();
int nNum = controllers.Length;
try
{
for (int i = 0; i <= (nNum - 1); i++)
{
if ((controllers[i].ServiceName.ToUpper() == serviceName.ToUpper()))
{
var v = controllers[i];
return v;
}
}
}
catch (Exception)
{
}
return null;
}
/// <summary>
/// 执行DOS命令返回DOS命令的输出
/// </summary>
/// <param name="dosCommand">dos命令</param>
/// <param name="milliseconds">等待命令执行的时间(单位:毫秒),
/// 如果设定为0则无限等待</param>
/// <returns>返回DOS命令的输出</returns>
public static string Execute(string command, int seconds)
{
string output = ""; //输出字符串
if (command != null && !command.Equals(""))
{
var pro = new Process();
pro.StartInfo.FileName = "cmd.exe";
pro.StartInfo.UseShellExecute = false;
pro.StartInfo.CreateNoWindow = true;
pro.StartInfo.RedirectStandardInput = true;
pro.StartInfo.RedirectStandardOutput = true;
pro.StartInfo.RedirectStandardError = true;
pro.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
pro.ErrorDataReceived += (sender, e) => Console.WriteLine(e.Data);
try
{
if (pro.Start())//开始进程
{
var sIn = pro.StandardInput;
sIn.AutoFlush = true;
var Codes = command.Split(new string[] {"\r\n"}, StringSplitOptions.None);
pro.BeginOutputReadLine();
foreach (var code in Codes)
{
sIn.WriteLine(code);
}
if (seconds == 0)
{
pro.WaitForExit();//这里无限等待进程结束
}
else
{
pro.WaitForExit(seconds); //等待进程结束,等待时间为指定的毫秒
}
output = pro.StandardOutput.ReadToEnd();//读取进程的输出
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);//捕获异常,输出异常信息
}
finally
{
if (pro != null)
pro.Close();
}
}
return output;
}
public static string InitServer(string Path,string Name)
{
var code = $@"@echo off
net stop {Name}
{Path} --remove {Name}
{Path} --install {Name}
net start {Name}";
return Execute(code,20);
}
}
}