仅写入console命令的输出

时间:2012-12-27 12:53:00

标签: c# .net console outputstream

我正在尝试构建一个运行一些控制台命令(如运行phantomJs)的.net应用程序,并返回操作结果。但是默认情况下,我从cmd.exe开始到关闭它都会得到一切。有什么想法可以快速修复或者我需要使用正则表达式吗?

这是我现在的代码:

System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardError = true;

System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);
System.IO.StreamReader sOut = proc.StandardOutput;

System.IO.StreamWriter sIn = proc.StandardInput;

sIn.WriteLine("phantomjs -v");
sIn.WriteLine("EXIT");

proc.Close();

string results = sOut.ReadToEnd().Trim();

sIn.Close();
sOut.Close();

4 个答案:

答案 0 :(得分:2)

PhantomJS是一个可执行文件(根据他们的文档) - 为什么不直接执行它而不是运行cmd.exe?这样可以避免cmd.exe噪音。

或者将phantomjs的输出重定向到日志文件并加载日志文件。

或者如果你绝对必须使用cmd.exe并且无法重定向...我可能会在phantomjs周围抛出一些回声标记作为解析开始/停止点。

例如,

echo PARSE START
runcommand.exe
echo PARSE STOP

但不要这样做。

答案 1 :(得分:1)

而不是使用不同的流。为什么不将cmd用作filename并将-c "phantomjs -v"作为参数传递给它。然后使用proc.StandardOutput.ReadToEnd()抓取控制台中输出的所有内容。这应该省去不需要的信息,因为它只读取执行的命令的输出是什么。

以下代码可能不起作用,但应该给你一般的想法。

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd";
psi.Arguments = "/c \"phantomjs -v\"";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
// Optional other options

Process proc = Process.Start(psi);

string output = proc.StandardOutput.ReadToEnd();

proc.WaitForExit();

答案 2 :(得分:0)

如果您使用的是unix机器:

sIn.WriteLine("phantomjs -v > /dev/null");

视窗:

sIn.WriteLine("phantomjs -v > NUL");

答案 3 :(得分:0)

我希望以下内容会有所帮助!

{

 Process xyProcess = new Process();

 xyProcess.StartInfo.FileName = "FilenameYouWant";
 xyProcess.StartInfo.UseShellExecute = false;
 xyProcess.StartInfo.CreateNoWindow = true;
 xyProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
 xyProcess.StartInfo.RedirectStandardInput = true;
 xyProcess.StartInfo.RedirectStandardOutput = true;
 xyProcess.StartInfo.RedirectStandardError = true;

 xyProcess.StartInfo.Arguments += "any arg1 you want ";
 xyProcess.StartInfo.Arguments += "any arg2 you want ";

 xyProcess.EnableRaisingEvents = true;
 xyProcess.OutputDataReceived += process_DataReceived;

 // Start the process
 xyProcess.Start();
 xyProcess.BeginErrorReadLine();
 xyProcess.BeginOutputReadLine();
 xyProcess.WaitForExit();

}
static private void process_DataReceived(object sender, DataReceivedEventArgs e)
{
    //Catch the process response here
}