Установка bat-файлов в качестве служб Windows с NSSM и управление ими

Я хочу использовать приложение nssm (Non-Sucking Service Manager), чтобы иметь возможность устанавливать bat-файлы в качестве служб Windows, а затем управлять ими. (запуск, остановка, получение статуса и т. д.). Обратите внимание, что я поместил nssm.exe на диск C.

Я проверил свой код, и он работает для простой команды, такой как "ping localhost". Но если я запускаю команды nssm, то это работает странно. Например, если я бегу:

C:\nssm.exe status WindowsServiceName

Тогда это дает мне такой вывод:

S\0E\0R\0V\0I\0C\0E\0_\0S\0T\0O\0P\0P\0E\0D\0\r\0\n\0

На самом деле вывод правильный. Он пишет "SERVICE_STOPPED", но есть много странных символов, и когда я открываю его в Text Visualizer, он показывает только "S".

Если я запускаю эту команду:

C:\nssm.exe start WindowsServiceName

Дает пустой вывод и сервис не запускается. Но если я вручную открываю командную строку и запускаю эти коды, все работает нормально.

Вот мой код:

using System.Diagnostics;

namespace NssmTestApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string cmdCommand = @"C:\nssm.exe start WindowsServiceName";
            string output = RunCmdCommand(cmdCommand);
        }

        private static string RunCmdCommand(string cmdCommand)
        {
            string output = "";

            ProcessStartInfo startInfo = new ProcessStartInfo();

            startInfo.WindowStyle = ProcessWindowStyle.Hidden;

            startInfo.FileName = "cmd.exe";
            startInfo.Arguments = "/C " + cmdCommand;
            startInfo.Verb = "runas";

            startInfo.RedirectStandardOutput = true;
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;
            startInfo.RedirectStandardError = true;

            Process process = Process.Start(startInfo);

            while (!process.HasExited)
            {
                output += process.StandardOutput.ReadToEnd();
            }

            return output;
        }
    }
}

Как я могу заставить этот код работать или есть более эффективный способ установки файлов bat в качестве службы Windows, а затем запуска, остановки, получения их статуса и т. Д.?

0 ответов

Другие вопросы по тегам