web-dev-qa-db-ja.com

VB.netでシェルコマンドの出力を取得する

Shell関数を呼び出すVB.netプログラムがあります。このコードから生成されたテキスト出力をファイルに取得したいと思います。ただし、これは実行されたコードの戻り値ではないため、方法がわかりません。

このプログラムはサービスですが、すでに他の情報をログに記録しているため、問題なくディスクにアクセスできます。サービス全体には複数のスレッドがあるため、ファイルが書き込まれるときに、まだアクセスされていないことも確認する必要があります。

17
David Brunelle

シェルからの出力をキャプチャすることはできません。

これをプロセスに変更する必要があり、プロセスから Standard Output (および場合によってはエラー)ストリームをキャプチャする必要があります。

次に例を示します。

        Dim oProcess As New Process()
        Dim oStartInfo As New ProcessStartInfo("ApplicationName.exe", "arguments")
        oStartInfo.UseShellExecute = False
        oStartInfo.RedirectStandardOutput = True
        oProcess.StartInfo = oStartInfo
        oProcess.Start()

        Dim sOutput As String
        Using oStreamReader As System.IO.StreamReader = oProcess.StandardOutput
            sOutput = oStreamReader.ReadToEnd()
        End Using
        Console.WriteLine(sOutput)

標準エラーを取得するには:

'Add this next to standard output redirect
 oStartInfo.RedirectStandardError = True

'Add this below
Using oStreamReader As System.IO.StreamReader = checkOut.StandardError
        sOutput = oStreamReader.ReadToEnd()
End Using
31
competent_tech

出力をテキストファイルにパイプするだけですか?

MyCommand > "c:\file.txt"

次に、ファイルを読み取ります。

9
MarkJ
    Dim proc As New Process

    proc.StartInfo.FileName = "C:\ipconfig.bat"   
    proc.StartInfo.UseShellExecute = False
    proc.StartInfo.RedirectStandardOutput = True
    proc.Start()
    proc.WaitForExit()

    Dim output() As String = proc.StandardOutput.ReadToEnd.Split(CChar(vbLf))
    For Each ln As String In output
        RichTextBox1.AppendText(ln & vbNewLine)
        lstScan.Items.Add(ln & vbNewLine)
    Next

================================================== =====================以下に示すように、2行でバッチファイルを作成します。

    echo off
    ipconfig

'このバッチファイルをipconfig.batまたは選択した名前に保存してください。ただし、最後にドットバットを付けてください。

1
Scotty Stultz