Visual Basic (Visual Studio 2005) перенаправляет поток ввода в процесс - PullRequest
2 голосов
/ 22 октября 2009

Я искал в сети примерно три часа без продвижения вперед. Я не очень хорошо знаю VB, но мне нужно создать программу-оболочку для любого исполняемого файла, который регистрирует аргументы, всю информацию ввода, вывода и ошибки:

  • Моя оболочка называется: например someApp.exe arg1 arg2
  • Записывает в someApp.log: arg1 arg2
  • Вызывает оригинальный исполняемый файл: _someApp.exe arg1 arg2
  • Необходимо регистрировать и пересылать любые консольные входные данные в _someApp.
  • Необходимо регистрировать любые выходные данные и поток ошибок из процесса _someApp

Хорошо, я застрял в пункте 4 сейчас:

        Dim p As New ProcessStartInfo
        p.FileName = execute
        p.Arguments = Command()
        p.UseShellExecute = False
        p.CreateNoWindow = True
        p.RedirectStandardInput = True
        p.RedirectStandardError = True
        p.RedirectStandardOutput = True

        Dim process As System.Diagnostics.Process
        process = Diagnostics.Process.Start(p)
        process.WaitForExit()

После окончания _someApp я могу считать и записать поток для его записи, но мне все еще нужно предоставить свои собственные входные данные оберток для процесса, и я хочу считывать и выводить поток в виде ошибки.

Спасибо за информацию / примеры

Ответы [ 2 ]

1 голос
/ 22 октября 2009

Хорошо, вот решение ...

Необходимые переменные:

Private process As System.Diagnostics.Process

Private threadOut As Thread

Private streamOut As System.IO.StreamReader

Private threadErr As Thread

Private streamErr As System.IO.StreamReader

Private threadIn As Thread

Private streamIn As System.IO.StreamWriter

Необходимые сабы:

Private Sub ThreadTaskOut()
    Dim line
    While Not process.HasExited
        line = streamOut.ReadToEnd
        If line <> Nothing And line <> "" Then
            log("Out: " & line)
            Console.Out.Write(line)
        End If
    End While
End Sub

Private Sub ThreadTaskErr()
    Dim line
    While Not process.HasExited
        line = streamErr.ReadToEnd
        If line <> Nothing And line <> "" Then
            log("Err: " & line)
            Console.Error.Write(line)
        End If
    End While
End Sub

Private Sub ThreadTaskIn()
    Dim line
    While Not process.HasExited
        line = Console.In.ReadLine
        If line <> Nothing And line <> "" Then
            log("In: " & line)
            streamIn.WriteLine(line)
        End If
    End While
End Sub

Внутри основной:

        ' create process information
        Dim p As New ProcessStartInfo
        p.FileName = execute
        p.Arguments = Command()
        p.UseShellExecute = False
        p.CreateNoWindow = True
        p.RedirectStandardInput = True
        p.RedirectStandardError = True
        p.RedirectStandardOutput = True

        ' log process start
        log("Execute: " & execute & " " & Command())

        ' start process
        process = Diagnostics.Process.Start(p)

        ' start thread for output stream
        streamOut = process.StandardOutput
        threadOut = New Thread(AddressOf ThreadTaskOut)
        threadOut.IsBackground = True
        threadOut.Start()

        ' start thread for error stream
        streamErr = process.StandardError
        threadErr = New Thread(AddressOf ThreadTaskErr)
        threadErr.IsBackground = True
        threadErr.Start()

        ' start thread for input stream
        streamIn = process.StandardInput
        threadIn = New Thread(AddressOf ThreadTaskIn)
        threadIn.IsBackground = True
        threadIn.Start()

        ' wait for the process to finish
        process.WaitForExit()

log - это еще одна подпрограмма для записи в файл, execute - это переменная, содержащая _someApp.exe из моего начального сообщения. Я до сих пор не знаю, правильно ли выводит консоль из потока inputtream, потому что мое упакованное приложение не имело никакого ввода, как кажется. Может кто-то заметит ошибку ...

Для моих целей, хмм, это работает так, как мне нужно

Greetz, GHAD

Код внутри основного

0 голосов
/ 22 октября 2009

Как насчет записи в приложение:

Dim sw as IO.StreamWriter = process.StandardInput
sw.WriteLine("Boo")

и для чтения со стандартного вывода:

Dim sr As IO.StreamReader = process.StandardOutput
Do
  aString = sr.ReadLine()
Loop Until (sr.EndOfStream)
...