2

私はネット上で約 3 時間、前に進むことなく検索してきました。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 が終了した後、ストリームを読み込んでログに記録することができますが、独自のラッパー入力をプロセスに提供する必要があり、それが発生したときにストリームを読み込んでエラーを発生させたいと考えています。

情報/例をありがとう

4

2 に答える 2

1

さて、ここで解決策...

必要な変数:

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を保持する変数です。ラップされたアプリには見た目どおりの入力がなかったため、inputstreamスレッドへのコンソールが正しく機能するかどうかはまだわかりません。誰かがエラーを見つけますように...

私の目的のために、うーん、それは私がそれを必要とするように機能します

グリーツ、GHad

メイン内のコード

于 2009-10-22T15:30:08.477 に答える
0

アプリへの書き込みはどうですか:

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)
于 2009-10-22T13:40:19.157 に答える