Получение информации из скриптов / вызовов командной строки в C # - PullRequest
2 голосов
/ 09 марта 2010

Я писал пару приложений, которые используют C # в качестве графического интерфейса, но под капотом всю работу выполняют с помощью скриптов (которые могут быть Python, Ruby и т. Д.).

Чтобы передать информацию из скрипта обратно в графический интерфейс (например, отчеты об ошибках и т. Д.), Я обычно прибегаю к вызову скрипта через Process и либо

  • Перенаправил ввод (StartInfo.RedirectStandardOutput и т. Д.) И прочитал это
  • Созданы временные файлы, которые GUI отслеживает / читает, чтобы узнать, что ему нужно знать

Ни один из этих методов не кажется идеальным (второй просто ужасен, мне кажется), но я не вижу другого способа сделать это. Возможно, нет, но я подумал, что стоит спросить, прежде чем я запустил другое приложение с подобным набором проблем.

Спасибо

1 Ответ

4 голосов
/ 09 марта 2010

Использование ProcessStartInfo.RedirectStandardInput, ProcessStartInfo.RedirectStandardOutput и ProcessStartInfo.RedirectStandardError (а также Process.ExitCode) прекрасно, особенно когда ваши скрипты строго следуют определенному соглашению:

  • предупреждения и описания ошибок перейдите на stderr
  • в случае ошибки завершаются с ненулевым кодом выхода (избегайте специального значения 259 STILL_ACTIVE )
  • в случае ошибки завершаются досрочно , если имеет смысл это сделать (избегает просеивания пользователем сообщения о километражных ошибках или необходимости использовать в своем графическом интерфейсе сообщения о километражных ошибках, например, MessageBox)
  • все остальные, обычные выходные данные идут на stdout (если применимо)

Ваш пользовательский интерфейс может легко:

  • читать сценарии stdout и stderr в отдельные буферы, пока сценарий не завершится
  • проверить код выхода скрипта:
    • если код выхода равен 0, а stderr пуст, сообщите пользователю, что Operation completed successfully
    • , если код выхода равен 0 и stderr не пусто, сообщить пользователю, что Operation completed with warnings, что позволяет пользователю дополнительно просматривать предупреждения из буфера stderr
    • , если код выхода не равен 0, сообщить пользователю, что Operation has failed with errors, что позволяет пользователю проверять ошибки из буфера stderr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...