我正在尝试构建一个运行一些控制台命令(如运行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();
答案 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
}