我有一个自定义控制台命令,如果在命令提示符下执行,则只在命令窗口中显示一些文本(类似于'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();
答案 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命令)方法中放置一个断点。