Записывать только вывод из консольной команды
Я пытаюсь создать приложение.net, которое будет запускать некоторые консольные команды (например, запуск phantomJs) и возвращать мне результаты операций. Но по умолчанию я получаю все с начала 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 ответа
Вместо того, чтобы использовать разные потоки. Почему бы не использовать 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();
PhantomJS - исполняемый файл (согласно их документам) - почему бы не выполнить это напрямую, а не запускать cmd.exe? Это позволит избежать шума cmd.exe.
Или перенаправьте вывод phantomjs в файл журнала и загрузите файл журнала.
Или, если вам абсолютно необходимо использовать cmd.exe и вы не можете перенаправить... Я бы, возможно, бросил несколько эхо-часовых вокруг фантомов, чтобы они служили точками начала / остановки разбора.
например,
echo PARSE START
runcommand.exe
echo PARSE STOP
Но не делай этого.
Если вы работаете на Unix-машине:
sIn.WriteLine("phantomjs -v > /dev/null");
Окна:
sIn.WriteLine("phantomjs -v > NUL");
Я надеюсь, что следующее будет полезно!
{
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
}