Записывать только вывод из консольной команды

Я пытаюсь создать приложение.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
}
Другие вопросы по тегам