У меня есть серия пакетных файлов, которые я хочу запустить с автоматическим вводом.Как определить, когда пакетный файл в другом процессе запрашивает ввод?
Все они имеют по крайней мере одну точку в своем исполнении, где они останавливаются и просят ввода. Либо через:
set /p FOO=Please enter value for FOO:
или просто простой
pause
Моя проблема заключается в том, что если я перенаправить ввод и потоков выводить подсказки прибывают только в выходной поток после того как я уже послал вход. Поэтому я должен прослушать вывод перед приглашением, чтобы запустить мой законченный ответ.
Это избавляет от двух сценариев. Другой, однако, не имеет выхода до первого приглашения.
Я попытался использовать Process.WaitForInputIdle, но это вызывает исключение, поскольку в этом процессе нет цикла сообщений.
Мой код до сих пор:
private void Foo()
var p = StartElevatedProcess("script.bat", true /*redirect*/);
p.OutputDataReceived += p_OutputDataReceived;
p.BeginOutputReadLine();
p.WaitForExit();
}
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data == null) return;
Console.WriteLine(e.Data);
if (e.Data.StartsWith("Install complete"))
{
((Process)sender).StandardInput.WriteLine();
}
}
Добавить предварительный запрос к третьему скрипту. – Kevin
@Kevin: Я мог бы это сделать, но вся цель упражнения - не вручную обрабатывать эти файлы вручную. – Kempeth
Просто случайная идея. Вы контролируете пакетный скрипт? Если это так, простой способ связи между потоком C# и интерпретатором cmd может заключаться в передаче данных в буфер обмена. Имейте пакетный скрипт '(echo prompt1) | клип', то есть C# do 'while (! System.Windows.Forms.ContainsText (" prompt1 ")) {System.Threading.Thread.Sleep (50)}' или подобное. – rojo