如何在 C# 中的 Windows 服务中执行批处理脚本

本文关键字:执行 批处理 脚本 服务 Windows 中的 | 更新日期: 2023-09-27 17:56:38

我正在尝试在 C# Windows 服务中执行.bat脚本,但它似乎不起作用。

所以我尝试执行的脚本,startup.bat,反过来调用另一个脚本,call catalina.bat ...,而另一个脚本又执行start java ...

我可以手动执行启动.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();
    }
}

我不明白为什么这不执行。我做错了什么?

是的,你可能会注意到我正在尝试在Windows上启动Tomcat作为C#的服务。好吧,我这样做是因为由于各种原因.exe我一直无法使用 tomcat7,但最好不要问我为什么要做这样的事情。不管是什么原因,我在这里做的事情也应该有效,不是吗?

针对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)

啊!我感到很生气!

如何在 C# 中的 Windows 服务中执行批处理脚本

运行"cmd.exe"并将"startup.bat"作为参数传递。

为了关闭这个循环,问题确实是Windows安全权限问题。

这里提出的建议似乎解决了我的问题。

尝试在服务设置中设置"允许服务与桌面交互"。

可能的重复 - 注销时在 Windows 服务中运行批处理文件

如果您的脚本作为交互式用户运行良好,但不能作为服务运行良好,那么有几个明显的可能原因:

  1. 您的服务在无法执行脚本中的操作的用户帐户下运行。
  2. 脚本尝试与桌面交互,但由于会话 0 隔离而无法交互。

这些建议本质上是猜测,但由于信息太少,很难做得更好。

尝试:

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