C# 使用NSSM将bat文件安装为windows服务并对其进行控制
我希望使用nssm(非吸盘服务管理器)应用程序能够将bat文件安装为windows服务,然后控制它们。(启动、停止、获取状态等)。请注意,我将nssm.exe放在C驱动器中 我测试了我的代码,它适用于像“pinglocalhost”这样的简单命令。但是如果我运行nssm命令,那么它的工作方式会很奇怪。例如,如果我运行: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\
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解决了该问题。所以你是对的。请针对这种情况写一个合适的答案,我会把它标记为答案。在这种情况下,自我回答更合适。我指出了问题所在,但你找到了解决办法。如果可能,请张贴更正的代码。