在C#Windows服务中运行自定义命令

时间:2011-08-15 12:35:08

标签: c# .net windows-services

我有一个自定义控制台命令,如果在命令提示符下执行,则只在命令窗口中显示一些文本(类似于'dir'命令)。

我正在尝试从Windows服务执行命令'myCommand',它总是返回空字符串值。但是,如果在命令提示符中运行相同的命令,则结果将显示在命令窗口中。此外,如果我在Windows窗体应用程序中运行以下代码,它工作正常,我得到相同的数据,在命令屏幕中显示一个字符串变量。

我哪里错了?当我从Windows服务执行代码时,为什么代码返回一个空字符串,因为它在表单应用程序中工作。是否有任何其他方法可以将命令的结果捕获到Windows服务中的字符串变量?请指教。谢谢。

System.Diagnostics.ProcessStartInfo procStartInfo = 
    new System.Diagnostics.ProcessStartInfo("cmd", "/c myCommand");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
string result = proc.StandardOutput.ReadToEnd();

3 个答案:

答案 0 :(得分:1)

将Visual Studio调试器附加到正在运行的服务(Debug菜单,Attach to Process),在执行该命令的代码中放置一个断点,然后执行该命令。这将使您能够调试问题。如有必要,您可以调用服务中的System.Diagnostics.Debugger.Break方法,强制它在适当的时候进入调试器,而不必先连接调试器。

编辑:

我建议您也捕获标准错误流:

procStartInfo.RedirectStandardError = true;
...
string error = proc.StandardError.ReadToEnd(); 
proc.WaitForExit();

检查错误字符串中的内容。我使用WaitForExit等待命令退出。

答案 1 :(得分:1)

您没有设置工作目录(即procStartInfo.WorkingDirectory),因此如果系统找不到“myCommand”,您将获得此结果。

即使'myCommand'与服务exe文件位于同一目录中,但通常不起作用,因为服务的工作目录通常是windows \ system32。

答案 2 :(得分:0)

我更喜欢这个Easier way to debug a C# Windows Service

我添加了条件If从OnStart方法启动调试器,然后在我的 OnCustomCommand(int命令)方法中放置一个断点。