C# 使用.NET进程执行时,“查找外壳程序”命令不起作用。请从重定向的输出流开始

C# 使用.NET进程执行时,“查找外壳程序”命令不起作用。请从重定向的输出流开始,c#,.net,batch-file,process.start,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, Redi

我对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命令。启动
并重定向输出流


谢谢你的帮助。

如果没有更多信息,就无法说出你有什么问题。然而,以下工作:

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
命令需要引用search string参数。

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

无论如何,要解决此问题,您可以直接使用cmd.exe,例如,将ProcessStartInfo更改为:

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

并确保等待命令退出。

如何检索输出以获得空结果?请显示一个完整的代码示例,演示该问题。感谢您的回答。我已经编辑了我以前的帖子,并且对我的问题添加了更好的描述。