RedirectStandardOutput и команда pause в пакетных файлах - PullRequest
2 голосов
/ 22 октября 2010

В моем коде C # мне нужно запустить некоторые внешние процессы. Это могут быть командные файлы или исполняемые файлы. Я перенаправляю вывод в собственное окно, если RedirectStandardOutput из ProcessStartInfo будет истинным. Это позволяет пользователю просматривать выходные данные даже после завершения внешнего процесса. Я также перенаправляю ввод, чтобы пользователь мог нажимать клавиши при необходимости. Это работает очень хорошо в целом.

Однако у меня есть одна проблема. Некоторые из пакетных файлов используют команду PAUSE. По-видимому, команда не очищает вывод до тех пор, пока не будет нажата клавиша. Таким образом, пользователь никогда не видит подсказку. Таким образом, только после нажатия клавиши пользователь увидит, что он должен был нажать клавишу, чтобы продолжить. Есть ли способ заставить эту работу (кроме «Не использовать паузу»)?

EDIT: командные файлы запускаются постпроцессором CAM пользователя и обычно создаются пользователем (или ИТ-отделом пользователя). Поэтому требовать внесения изменений в эти файлы или «взлома» путем создания pause.exe на самом деле не является жизнеспособным решением (если только это не последнее средство).

1 Ответ

4 голосов
/ 22 октября 2010

В CMD попробуйте

batchWithPause.bat < nul

В C # это будет примерно так:

 Process.Start("batchWithPause.bat", "< nul");

РЕДАКТИРОВАТЬ Так что вы просто хотите, чтобы пользователь увидел "Нажмите любую клавишу для продолжения"?Затем добавьте

@echo "Press any key to continue..."

перед каждым pause вызовом.Вы также можете:

  1. написать свой собственный pause.bat, который по сути делает это
  2. написать простой pause.exe, скажем, на c #:

    publicstatic void Pause () {Console.WriteLine («Нажмите ввод, чтобы продолжить.»);Console.Read ();}

РЕДАКТИРОВАТЬ 2 Теперь я понимаю вашу проблему.И асинхронный OutputDataReceived, и StreamReader.ReadLine () будут читать паузу «Нажмите любую клавишу для продолжения» только после того, как пользователь нажал клавишу.Однако, если бы вы зациклились на StreamReader.Read () самостоятельно, вы также получите «Нажмите любую клавишу для продолжения».Так что, похоже, это ваш единственный возможный маршрут.

...