簡體   English   中英

如何在C#中的Windows服務中執行批處理腳本?

[英]How can I execute a batch script in a windows service in C#?

我正在嘗試在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();
    }
}

我不明白為什么這個不執行。 我究竟做錯了什么?

是的,您可能會注意到我正在嘗試在Windows上使用C#將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)

哎呀! 我感到很生氣!

運行“ cmd.exe”並傳遞“ startup.bat”作為參數。

為了解決這個問題,問題確實是Windows安全權限問題。

提出的建議在這里似乎解決我的問題。

嘗試在服務設置中設置“允許服務與桌面交互”。

可能重復- 注銷時在Windows Service中運行批處理文件

嘗試:

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

如果您的腳本可以作為交互式用戶運行,但不能作為服務運行,則可能有兩個明顯的原因:

  1. 您的服務在無法執行腳本中操作的用戶帳戶下運行。
  2. 您的腳本嘗試與桌面進行交互,但由於會話0隔離而無法進行。

這些建議本質上是猜測,但由於信息很少,因此很難做得更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM