Я асинхронно читаю вывод из командного файла после запуска его с некоторыми параметрами. Если командный файл ожидает ввода - текст запроса на ввод не перенаправляется - если процесс не завершен (что, очевидно, слишком поздно для ответа).Асинхронно считывает вывод cmd в .NET. - Висит на запрос ввода процесса.
Если выполняется в стандартном окне CMD, подсказка:
OpenEdge Release 10.2B07 as of Fri Sep 7 02:16:54 EDT 2012
testdb already exists.
Do you want to over write it? [y/n]:
Выход при использовании перенаправления будет висеть, не вызывая outputdatarecieved событие, поэтому я не могу обработать запрос на вход и реагировать соответствующим образом. Консоль не читает последнюю строку (запрос ввода):
OpenEdge Release 10.2B07 as of Fri Sep 7 02:16:54 EDT 2012
testdb already exists.
Код:
Private Sub someMethod()
Dim process As New Process()
process.StartInfo = New ProcessStartInfo("C:\OEV10\bin\_dbutil")
process.StartInfo.WorkingDirectory = "C:\Temp\"
process.StartInfo.Arguments = "prorest testdb C:\Temp\testdb.bck -verbose"
process.EnableRaisingEvents = True
With process.StartInfo
.UseShellExecute = False
.RedirectStandardError = True
.RedirectStandardOutput = True
.RedirectStandardInput = True
.CreateNoWindow = False
.StandardOutputEncoding = System.Text.Encoding.GetEncoding(Globalization.CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
.StandardErrorEncoding = System.Text.Encoding.GetEncoding(Globalization.CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
End With
AddHandler process.Exited, AddressOf ProcessExited
AddHandler process.OutputDataReceived, AddressOf Async_Data_Received2
AddHandler process.ErrorDataReceived, AddressOf Async_Data_Received2
process.Start()
process.BeginOutputReadLine()
process.BeginErrorReadLine()
End Sub
Private Sub Async_Data_Received2(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
Console.WriteLine(e.Data)
End Sub
Если бы это был UNIX, вы, вероятно, использовали бы его как «да». prorest ... ' –
'OutputDataReceived' срабатывает при получении полной строки. Но, судя по всему, ваш пакетный файл не ставит новый символ линии в конце 'Вы хотите написать? [y/n]: 'строка. – PetSerAl
Tom - я делаю именно это для удаления (всегда будет запрашивать), однако для восстановления это больше подходит для обработки ошибок, поскольку база данных не должна существовать, хотя я бы хотел, чтобы приложение для безопасного ответа получило приглашение , – madlan