Как я могу выполнить пакетный скрипт в службе Windows в C #? - PullRequest
2 голосов
/ 14 мая 2011

Я пытаюсь выполнить скрипт .bat в C # windows service, но, похоже, он не работает.

Итак, скрипт, который я пытаюсь выполнить, startup.bat, в свою очередь, вызывает другой скрипт, call catalina.bat ..., который, в свою очередь, выполняет start java ...

Я могу запустить startup.bat вручную, но я хочу запустить его как службу Windows. Когда я пытаюсь сделать это в приложении службы C # windows, кажется, ничего не происходит. Мой код службы Windows выглядит следующим образом:

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

Я не понимаю, почему это не выполняется. Что я делаю не так?

И да, вы можете заметить, что я пытаюсь запустить Tomcat в Windows как сервис с C #. Ну, я делаю это, потому что я не смог использовать tomcat7.exe по разным причинам, но, вероятно, лучше не спрашивать, почему я делаю такие вещи. Какова бы ни была причина, то, что я делаю здесь, должно также работать, не так ли?

Обновление в ответ на предложение Гейба:

Если я установлю UseShellExecute = true, я получу исключение:

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)

Поэтому я установил для RedirectStandardError и RedirectStandardOutput значение false, что приводит к этой ошибке:

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! Я чувствую себя раздраженным!

Ответы [ 5 ]

3 голосов
/ 14 мая 2011

Запустите «cmd.exe» и передайте «startup.bat» в качестве аргумента.

2 голосов
/ 21 мая 2011

Чтобы замкнуть цикл, проблема действительно была в правах доступа Windows.

Предложение, сделанное здесь , похоже, решило мою проблему.

1 голос
/ 14 мая 2011

Попробуйте установить «Разрешить сервису взаимодействовать с рабочим столом» в настройках сервиса.

Возможное дублирование - Запуск пакетных файлов в службе Windows при выходе из системы

0 голосов
/ 14 мая 2011

Если ваш скрипт работает нормально как интерактивный пользователь, а не как служба, то есть несколько очевидных возможных причин:

  1. Ваша служба работает под учетной записью пользователя, которая не может выполнять действия в сценарии.
  2. Ваш сценарий пытается взаимодействовать с рабочим столом, но не может из-за изоляции сеанса 0.

Эти предложения, по сути, являются догадками, но с таким небольшим количеством информации трудно добиться большего успеха.

0 голосов
/ 14 мая 2011

Попробуйте:

FileName = "%comspec%",
Arguments = "/C " + Path.Combine(@"C:\server", processFileName),
...