Wie kann ich das ausführen einer batch-script in ein windows-Dienst in C#?

Ich versuche ausführen .bat-Skript in ein C# - windows-Dienst, aber es scheint nicht zu funktionieren.

Also das Skript, das ich versuche zu führen, startup.bat wiederum ein anderes script aufruft, call catalina.bat ..., die wiederum führt start java ...

Kann ich ausführen starten.bat manuell, aber ich will das es läuft als Windows-Dienst. Wenn ich versuche zu tun, die in einer C# - windows-service-Anwendung, scheint nichts zu passieren. Mein Windows-service-code sieht wie folgt aus:

public class MyService : ServiceBase
{
    public static void Main(string[] args)
    {
        ServiceBase.Run(new MyService());
    }

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);
        this.RunScript(@"bin\startup.bat");
        Thread.Sleep(1000);
    }

    protected override void OnStop()
    {
        base.OnStop();
        this.RunScript(@"bin\shutdown.bat");
        Thread.Sleep(1000);
    }

    private void RunScript(string processFileName)
    {
        var startInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = "/C " + Path.Combine(@"C:\server", processFileName),
            CreateNoWindow = true,
            ErrorDialog = false,
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            UseShellExecute = false,
            WindowStyle = ProcessWindowStyle.Hidden
        };

        startInfo.EnvironmentVariables.Add("CATALINA_HOME", @"c:\server");

        var process = new Process();
        process.StartInfo = startInfo;
        process.Start();
    }
}

Ich verstehe nicht, warum diese nicht ausgeführt wird. Was mache ich falsch?

Und ja, Sie können bemerken, dass ich versuche, starten Sie Tomcat auf Windows als Dienst mit C#. Naja ich mache das, weil ich nicht in der Lage zu verwenden tomcat7.exe aus verschiedenen Gründen, aber es ist wahrscheinlich besser, nicht zu Fragen, warum ich solche Sachen mache. Was auch immer der Grund ist, was ich hier mache, sollten auch funktionieren, sollte es auch nicht?

Update in Antwort auf Frank ' s Vorschlag:

Wenn ich UseShellExecute = true bekomme ich eine exception:

System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to redirect IO streams.
    at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
    at System.Diagnostics.Process.Start()
    at MyService.RunScript(String processFileName)

Also ich RedirectStandardError und RedirectStandardOutput false, ergibt diesen Fehler:

System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to use environment variables.
  at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
  at System.Diagnostics.Process.Start()
  at MyService.RunScript(String processFileName)

argh! Ich fühle mich verärgert!

Ich glaube, Sie brauchen UseShellExecute = true für diese zu arbeiten.
Aktualisiert mit, was passiert, wenn ich dies versuchen. Danke.
Eigentlich habe ich aktualisiert, Systemstart.Fledermaus, so dass es nicht müssen Sie die Umgebungsvariable. Immer noch nichts... 🙁
Ist es wirklich benötigen stdio-Umleitung?
Ich meinte, dass ich RedirectStandardOutput auf false nach der Einstellung UseShellExecute auf true. Ich nahm auch Antworten auf ein paar älteren Fragen... jetzt besser?

InformationsquelleAutor Frank Flannigan | 2011-05-14

Schreibe einen Kommentar