0

我有一个简单的 Windows 服务,它调用批处理文件来在启动时设置一些进程。大多数批处理文件已正确触发,但由于 Windows 服务无法启动,InstallUtil /i 无法运行。(InstallUtil /u 事先可以工作,但我觉得很奇怪)这是 Windows 服务和批处理文件的一些代码:

namespace RecipopStartupService
{
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        ProcessBatchFile();
    }


    public void ProcessBatchFile()
    {
        Process process = new Process();


        process.StartInfo.WorkingDirectory = "C:\\Webs\\AWS\\";
        process.StartInfo.FileName = "C:\\Webs\\AWS\\setup.bat";
        process.StartInfo.Arguments = "";
        process.StartInfo.Verb = "runas";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

        process.StartInfo.CreateNoWindow = true;

        process.StartInfo.RedirectStandardOutput = false;

        process.Start();


        System.IO.StreamReader myOutput = process.StandardOutput;
        process.WaitForExit(200000);
        if (process.HasExited)
        {
            string results = myOutput.ReadToEnd();
        }


    }


    protected override void OnStop()
    {
    }
}
}

批处理文件:

"C:\Program Files (x86)\Subversion\bin\SVN.exe" cleanup "C:\Webs\AWS\webs"
"C:\Program Files (x86)\Subversion\bin\SVN.exe" cleanup "C:\Webs\AWS\apps"

"C:\Program Files (x86)\Subversion\bin\SVN.exe" update "C:\Webs\AWS\webs"

REM The following directory is for .NET 2.0
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
set PATH=%PATH%;%DOTNETFX2%

echo Uninstalling MyService...
echo ---------------------------------------------------
InstallUtil /u "C:\Webs\AWS\apps\MyService.exe"
echo ---------------------------------------------------
echo Done.

"C:\Program Files (x86)\Subversion\bin\SVN.exe" update "C:\Webs\AWS\apps"

REM The following directory is for .NET 2.0
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
set PATH=%PATH%;%DOTNETFX2%

echo Installing MyService...
echo ---------------------------------------------------
InstallUtil /i "C:\Webs\AWS\apps\MyService.exe"
echo ---------------------------------------------------
echo Done.

NET START MyService

我已经注释掉了各个部分以确定是什么阻止了服务的启动。正如我之前所说,它是 InstallUtil /i 部分。

如果有人可以建议,那就太好了。

谢谢,科林

4

1 回答 1

2

我会直接在 Visual Studio 中调试您的 Windows 服务,而不是使用单独的控制台应用程序。有关执行此操作的详细信息,请在此处查看我的博客条目。

如果您愿意,您也可以不使用 InstallUtil 安装您的服务。只需设置对 System.Configuration.Install dll 的引用并使用ManagedInstallerClass .InstallHelper

在 C# 中结合这两种方法如下所示:

// This is the entry point
static void Main(string[] args)
{
    // If parameter passed, act on it
    if ( args.Length > 0 )
    {
        switch (args[0] )
        {
            // Debug the service as a normal app from within Visual Studio
            case DEBUG:
                MyService DebugService = new MyService();
                DebugService.OnStart(null);
                break;
            // Install the service programatically
            case INSTALL:
                ManagedInstallerClass.InstallHelper(new string[] _
                { Assembly.GetExecutingAssembly().Location });
                break;
            // Un-install the service programatically
            case UNINSTALL:
                ManagedInstallerClass.InstallHelper(new string[] +
                { UNINSTALL, Assembly.GetExecutingAssembly().Location });
                break;
            // We don't understand this parameter!
            default:
                message = string.Concat(DEBUG, " to run service manually.", Environment.NewLine);
                message += string.Concat(INSTALL, " to install service.", Environment.NewLine);
                message += string.Concat(UNINSTALL, " to un-install service.", Environment.NewLine);
                message += string.Concat("Do not understand the command-line parameter ", args[0]);
                throw new System.NotImplementedException(message);
        }
    }
    // If no parameter passed, just start the service normally
    else
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new MyService() };
        ServiceBase.Run(ServicesToRun);
    }
}
于 2012-07-17T18:07:20.643 回答