Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NSSM将bat文件安装为windows服务并对其进行控制_C#_Batch File_Windows Services_Nssm - Fatal编程技术网

C# 使用NSSM将bat文件安装为windows服务并对其进行控制

C# 使用NSSM将bat文件安装为windows服务并对其进行控制,c#,batch-file,windows-services,nssm,C#,Batch File,Windows Services,Nssm,我希望使用nssm(非吸盘服务管理器)应用程序能够将bat文件安装为windows服务,然后控制它们。(启动、停止、获取状态等)。请注意,我将nssm.exe放在C驱动器中 我测试了我的代码,它适用于像“pinglocalhost”这样的简单命令。但是如果我运行nssm命令,那么它的工作方式会很奇怪。例如,如果我运行: C:\nssm.exe status WindowsServiceName 然后它给了我这个输出: S\0E\0R\0V\0I\0C\0E\0_\0S\0T\0O\0P\0P\

我希望使用nssm(非吸盘服务管理器)应用程序能够将bat文件安装为windows服务,然后控制它们。(启动、停止、获取状态等)。请注意,我将nssm.exe放在C驱动器中

我测试了我的代码,它适用于像“pinglocalhost”这样的简单命令。但是如果我运行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”,但有很多奇怪的字符,当我在文本可视化工具中打开它时,它只显示“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服务,然后启动、停止它们,获取它们的状态等?

看起来NSSM正在生成UTF-16输出。将startInfo的StandardOutputEncoding属性设置为Encoding。Unicode解决了该问题。所以你是对的。请针对这种情况写一个合适的答案,我会把它标记为答案。在这种情况下,自我回答更合适。我指出了问题所在,但你找到了解决办法。如果可能,请发布更正的代码。看起来NSSM正在生成UTF-16输出。将startInfo的StandardOutputEncoding属性设置为Encoding。Unicode解决了该问题。所以你是对的。请针对这种情况写一个合适的答案,我会把它标记为答案。在这种情况下,自我回答更合适。我指出了问题所在,但你找到了解决办法。如果可能,请张贴更正的代码。