Comment puis-je exécuter un script batch dans un service windows en C#?

Je suis en train d'exécuter une .chauve-souris de script en C# windows service, mais il ne semble pas fonctionner.

Ainsi, le script que je suis en train d'exécuter, startup.bat, à son tour, appelle un autre script, call catalina.bat ..., qui à son tour s'exécute start java ...

Je peut exécuter de démarrage.chauve-souris à la main, mais je veux l'exécuter en tant que service Windows. Quand j'essaie de le faire en C# windows de l'application de service, rien ne semble se produire. Mon service Windows code ressemble à ceci:

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();
    }
}

Je ne comprends pas pourquoi cela ne s'est pas exécuté. Ce que je fais mal?

Et oui, vous remarquerez peut-être que je suis en train de lancer Tomcat sous Windows en tant que service avec C#. Eh bien, je fais cela parce que je n'ai pas été en mesure d'utiliser tomcat7.exe pour diverses raisons, mais il est probablement mieux de ne pas se demander pourquoi je suis en train de faire de telles choses. Quelle que soit la raison, ce que je fais ici doivent aussi travailler, n'est-ce pas?

Mise à jour en réponse à Gabe de la suggestion:

Si j'ai mis UseShellExecute = vrai j'obtiens une 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)

J'ai donc mis en RedirectStandardError et RedirectStandardOutput à faux, ce qui donne cette erreur:

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! Je me sens exaspérés!

  • Je pense que vous avez besoin UseShellExecute = true pour que cela fonctionne.
  • Mise à jour avec ce qui se passe si j'essaie ce. Merci.
  • En fait, j'ai mis à jour le démarrage.chauve-souris de sorte qu'il n'a pas besoin de la variable d'environnement. Toujours rien... 🙁
  • Est-ce vraiment nécessaire de stdio de redirection?
  • Je voulais dire que j'ai mis RedirectStandardOutput false après la mise UseShellExecute de vrai. J'ai aussi accepté les réponses à quelques vieilles questions... mieux maintenant?