我正在尝试在C#windows服务中执行.bat脚本,但它似乎不起作用。
因此我尝试执行的脚本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();
}
}
我不明白为什么这不执行。我做错了什么?
是的,您可能会注意到我正在尝试使用C#在Windows上启动Tomcat作为服务。好吧,我这样做是因为我无法使用tomcat7.exe因各种原因,但最好不要问我为什么要这样做。不管是什么原因,我在这里做的也应该有用,不应该吗?
根据Gabe的建议更新:
如果我设置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)
哎呀!我感到很生气!
答案 0 :(得分:3)
运行“cmd.exe”并将“startup.bat”作为参数传递。
答案 1 :(得分:2)
要关闭此循环,问题确实是Windows安全权限问题。
here提出的建议似乎解决了我的问题。
答案 2 :(得分:1)
尝试在服务设置中设置“允许服务与桌面交互”。
答案 3 :(得分:0)
尝试:
FileName = "%comspec%",
Arguments = "/C " + Path.Combine(@"C:\server", processFileName),
答案 4 :(得分:0)
如果您的脚本作为交互式用户运行良好但不是作为服务运行,则有几个明显的可能原因:
这些建议基本上是猜测,但由于信息太少,很难做得更好。