.NET Console StandardOutput не возвращает входной «вопрос» - PullRequest
0 голосов
/ 28 июня 2011

Я пытаюсь полностью перехватить консольное приложение, то есть захватить его вывод и вставить ввод.

Пока что я могу в значительной степени захватить вывод, и ввод совершенно идеален. Тем не менее, он не будет отображать «префикс» / «вопрос» вывода консоли, пока вы не отправите какой-либо ввод.

Например, при подключении к консоли CMD.exe. Когда вы регулярно запускаете его в Windows, вы получаете что-то вроде этого:

Microsoft Windows [Версия 6.1.7600]
Авторские права (c) 2009 Корпорация Microsoft. Все права защищены.

C: \ Users \ Имя пользователя>

Однако вывод только возвращает:

Microsoft Windows [Версия 6.1.7600]
Авторские права (c) 2009 Корпорация Microsoft. Все права защищены.

И затем, когда вы вставляете что-то вроде «D:» (чтобы перейти на диск D: \), вы получаете следующее:

C: \ Users \ Имя пользователя> D:

И это все. Также не выдает "D: \>", начиная цикл заново.

Это мой текущий код, однако я на 99% уверен, что в этом нет ничего плохого. Он отлично работает за исключением этого.

Class MainWindow

Private MainDispatcher As System.Windows.Threading.Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher

Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    StartProcess("cmd.exe")
End Sub

Private Sub InputTB_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles InputTB.KeyUp
    If e.Key = System.Windows.Input.Key.Enter Then
        InputStream.WriteLine(InputTB.Text)
        InputTB.Text = ""
    End If
End Sub

Private InputStream As IO.StreamWriter
Private OutputStream As IO.StreamReader
Public ProcessToMonitor As New Process
Private Sub StartProcess(ByVal FileName As String)

    ProcessToMonitor = New Process
    ProcessToMonitor.StartInfo.FileName = FileName
    ProcessToMonitor.StartInfo.UseShellExecute = False
    ProcessToMonitor.StartInfo.RedirectStandardError = True
    ProcessToMonitor.StartInfo.RedirectStandardOutput = True
    ProcessToMonitor.StartInfo.RedirectStandardInput = True
    ProcessToMonitor.StartInfo.ErrorDialog = False
    ProcessToMonitor.StartInfo.CreateNoWindow = True

    ProcessToMonitor.Start()

    InputStream = ProcessToMonitor.StandardInput
    OutputStream = ProcessToMonitor.StandardOutput

    ConstantReadThread.Priority = System.Threading.ThreadPriority.Lowest
    ConstantReadThread.Start()
End Sub

Private Sub OutputReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
    MainDispatcher.Invoke(New WriteOutputDelegate(AddressOf WriteOutput), e.Data)
End Sub

Private ConstantReadThread As New System.Threading.Thread(AddressOf ConstantRead)
Private Sub ConstantRead()
    Do
        MainDispatcher.Invoke(New WriteOutputDelegate(AddressOf WriteOutput), OutputStream.ReadLine())
    Loop
End Sub

Private Delegate Sub WriteOutputDelegate(ByVal Text As String)
Private Sub WriteOutput(ByVal Text As String)
    OutputTB.Text &= Text & vbNewLine
    OutputTB.ScrollToEnd()
End Sub

Конечный класс

Я также знаю о «OutputDataReceived», который я использовал сначала, у которого были те же проблемы, поэтому я перешел к циклу чтения, я знаю, что он потребляет больше ресурсов процессора.

И, как всегда, любая помощь очень ценится.

-René

P.S. Решения / предложения в C # .Net также принимаются.

1 Ответ

1 голос
/ 28 июня 2011

Нет способа получить дополнительные данные, которые вы ищете, поскольку они генерируются через «CMD» как само приложение.Я считаю, что функциональность, которую вы пытаетесь получить, даже не выводится в выходной поток.

Это может быть потому, что Windows добавляет эту дополнительную функциональность к каждому отдельному консольному приложению, которое она запускает, а не то, что приложение фактически отправляет.в качестве выходного потока.

То, что я предлагаю вам сделать, - это определить путь по умолчанию, в котором CMD начинается (кажется, эквивалент):

System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)

Вы можете использовать это дляимитируйте ту же функциональность.

Если вы хотите узнать, где CMD проверяет приложения и т. д., посмотрите переменные среды в вашей системе, в частности, переменную среды "PATH".

...