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

在C#Windows服务中运行自定义命令,c#,.net,windows-services,C#,.net,Windows Services,我有一个自定义控制台命令,如果在命令提示符下执行,它只会在命令窗口中显示一些文本(类似于“dir”命令) 我试图从windows服务执行命令“myCommand”,它总是返回空字符串值。但是,如果在命令提示符下运行相同的命令,结果将显示在命令窗口中。此外,如果我在windows窗体应用程序中运行以下代码,它工作正常,并且我得到的数据与命令屏幕中显示的字符串变量相同 我哪里做错了?为什么当我从windows服务执行代码时,代码返回一个空白字符串,因为它在窗体应用程序中工作。是否有其他方法可以将命令

我有一个自定义控制台命令,如果在命令提示符下执行,它只会在命令窗口中显示一些文本(类似于“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();

将Visual Studio调试器附加到正在运行的服务(调试菜单,附加到进程),在执行命令的代码中放置一个断点,然后执行comand。这将使您能够调试问题。如有必要,您可以在服务中调用该方法,强制它在适当的点进入调试器,而无需先附加调试器

编辑:

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

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

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

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

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

我更喜欢这样


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

您如何知道您的命令是从服务中工作的?它不是从服务中工作的。这就是问题所在。它在windows窗体应用程序中工作正常。windows服务在哪个用户下运行?这个命令做什么?它在小路上吗?通常这类事情与权限/权限有关。。。请提供更多信息以使其更清楚,让我们假设我必须在windows命令控制台中运行'dir'命令。如果在命令提示符下执行dir,它将在命令窗口中显示目录和文件的列表。现在,如果我将我给出的代码“myCommand”替换为“dir”,并在windows窗体应用程序中按下按钮时执行它,我将得到相同的结果,它将存储在字符串变量“result”中。但是如果我在windows服务中运行相同的代码,结果总是“”。不知道为什么。服务正在我的ID下运行。请更正并在必要时提供建议。谢谢。你是说服务的
dir
结果是
”?谢谢你的帖子。我在论坛上发布这个问题之前做了这个。这就是为什么我知道服务在执行上述代码的最后一行时返回“”(您好,斯格摩尔,谢谢您的输入。但是,如果您认为工作目录可能是原因,那么当我在windows窗体应用程序中使用相同的代码时,它是如何工作的?很困惑。对于windows窗体应用程序,您的工作目录通常设置为应用程序所在的文件夹。例如,这可能是如果要创建应用程序的快捷方式,或者要浏览到文件夹并双击应用程序,则默认设置为。