我在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
一起工作并重定向输出流?
感谢您的帮助。
答案 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
命令需要引用搜索字符串参数。