使用带有重定向输出流的.NET Process.Start执行时,FIND shell命令不起作用

时间:2011-10-25 08:28:30

标签: c# .net batch-file process.start

我在bat文件中遇到了windows shell find命令的问题。 find命令的输出始终为空。 Bat文件是使用C#中的.NET Process.Start方法执行的。我使用输出流重定向。我想做什么:

ProcessStartInfo processInfo = new ProcessStartInfo("c:\test.bat")
{
  CreateNoWindow = true,                        
  UseShellExecute = false,
  RedirectStandardOutput = true,
  RedirectStandardError = true
};
Process testProcess = new Process();
testProcess.EnableRaisingEvents = true;
testProcess.OutputDataReceived += new DataReceivedEventHandler(testProcess_OutputDataReceived);
testProcess.ErrorDataReceived += new DataReceivedEventHandler(testProcess_ErrorDataReceived);                    
testProcess.StartInfo = processInfo;
testProcess.Start();

批处理文件(c:\ test.bat)包含重定向到输出文件的find命令:

find /I "TestString" "c:\TestInput.xml" > output.txt

outputStream的重定向工作正常,但output.txt的内容为空(文件大小为0B)。当我执行相同的批处理命令时,output.txt包含找到的字符串出现。是否可以让批处理文件中的find命令与Process.Start一起工作并重定向输出流?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

禁用ShellExecute时无法直接通过Process类启动批处理文件(并且无法在启用ShellExecute的情况下重定向)。这是因为批处理文件在某种意义上并不是真正可执行的,它是资源管理器中的一个人工构造。

无论如何,你可以做些什么来修复它是直接使用cmd.exe,例如将您的ProcessStartInfo更改为:

new ProcessStartInfo(@"cmd.exe", @"/c C:\test.bat")

还要确保等待命令退出。

答案 1 :(得分:0)

如果没有更多信息,就无法说出你遇到了什么问题。但是,以下工作:

var find = new Process();
var psi = find.StartInfo;
psi.FileName = "find.exe";
psi.UseShellExecute = false;
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;

// remember to quote the search string argument
psi.Arguments = "\"quick\" xyzzy.txt";

find.Start();

string rslt = find.StandardOutput.ReadToEnd();

find.WaitForExit();

Console.WriteLine("Result = {0}", rslt);

Console.WriteLine();
Console.Write("Press Enter:");
Console.ReadLine();
return 0;

对我的示例文件运行它会产生与使用相同参数从命令行运行find时获得的结果相同的结果。

可能会让你感到震惊的是find命令需要引用搜索字符串参数。