Я пытаюсь выполнить скрипт .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! Я чувствую себя раздраженным!