DOBON.NETプログラミング道掲示板

■35494 / 親記事)  VB.NETからcmdでpingを実行した時の結果
  
□投稿者/ ぱんだ 一般人(1回)-(2023/08/22(Tue) 19:38:48)
  • アイコン環境/言語:[環境:Windows11 Pro 64bit 使用言語:VB.NET(Visual Studio 2022)] 
    分類:[.NET] 

    はじめまして。
    
    最近プログラミングを始めようと思い立ち以下のサンプルを試してみたのですが、
    pingのように結果がリアルタイム?で何度も返ってくる場合のサンプルコードを
    知りたいです。
    https://dobon.net/vb/dotnet/process/standardoutput.html
    
    ipconfigなどのように結果が1回で終わるものは上記のサンプルで出来ました。
    
    Visual Studio 2022をWindows11 Pro 64bitで使用しています。
    
    お手数をおかけしますが、よろしくお願いいたします。
    

マルチポストを報告
違反を報告
引用返信 削除キー/
■35495 / ResNo.1)  Re[1]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ KOZ 一般人(23回)-(2023/08/22(Tue) 21:00:42)
  • アイコン
    No35494に返信(ぱんださんの記事)
    > pingのように結果がリアルタイム?で何度も返ってくる場合のサンプルコードを
    > 知りたいです。
    
    Process.StandardOutput は StreamReader です。
    EndOfStream プロパティが True になるまで ReadLine を繰り返してください。
    
    Using p As New Process
        p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.StartInfo.RedirectStandardInput = False
        p.StartInfo.CreateNoWindow = True
        p.StartInfo.Arguments = "/c ping 127.0.0.1"
        p.Start()
        Dim reader = p.StandardOutput
        Do Until reader.EndOfStream
            Dim buffer = reader.ReadLine()
            Console.WriteLine(buffer)
        Loop
        p.WaitForExit()
    End Using
    Console.WriteLine("何かキーを押すと終了します。")
    Console.ReadKey()
    

違反を報告
引用返信 削除キー/
■35496 / ResNo.2)  Re[2]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ ぱんだ 一般人(2回)-(2023/08/22(Tue) 23:54:44)
  • アイコン
    早速の返信ありがとうございます。
    おかげさまで以下のコードで実現できて助かりました。
    これから少しづつ学んでいこうと思います。
    ありがとうございました。
    
            Using p As New Process
                p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
                p.StartInfo.UseShellExecute = False
                p.StartInfo.RedirectStandardOutput = True
                p.StartInfo.RedirectStandardInput = False
                p.StartInfo.CreateNoWindow = True
                p.StartInfo.Arguments = "/c ping 127.0.0.1"
                p.Start()
                Dim reader = p.StandardOutput
                Do Until reader.EndOfStream
                    Dim buffer = reader.ReadLine()
                    '以下3行を追加
                    Debug.Print(buffer)
                    TextBox1.Text = TextBox1.Text & vbCrLf & buffer
                    Me.Refresh()
                Loop
                p.WaitForExit()
            End Using

違反を報告
引用返信 削除キー/
■35497 / ResNo.3)  Re[2]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ ぱんだ 一般人(3回)-(2023/08/23(Wed) 00:12:12)
  • アイコン
    KOZさん
    
    度々すみません。
    以下のコードと添付写真の通り作成してみたのですが、
    例えば添付写真のように途中でキャンセルする方法はありますか?
    実行中は他のボタンも押せなくなってしまいます。
    何度も申し訳ありませんが、可能でしたらサンプルコードを教えて
    いただけましたら幸いです。
    何卒よろしくお願いいたします。
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Process.StandardOutput は StreamReader です。
            'EndOfStream プロパティが True になるまで ReadLine を繰り返してください。
    
            Using p As New Process
                p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
                p.StartInfo.UseShellExecute = False
                p.StartInfo.RedirectStandardOutput = True
                p.StartInfo.RedirectStandardInput = False
                p.StartInfo.CreateNoWindow = True
                'p.StartInfo.Arguments = "/c ping 127.0.0.1"
                p.StartInfo.Arguments = "/c " & TextBox2.Text
                p.Start()
                Dim reader = p.StandardOutput
                Do Until reader.EndOfStream
                    Dim buffer = reader.ReadLine()
                    'Console.WriteLine(buffer)
                    Debug.Print(buffer)
                    TextBox1.Text = TextBox1.Text & vbCrLf & buffer
                    Me.Refresh()
                Loop
                p.WaitForExit()
            End Using
            'Console.WriteLine("何かキーを押すと終了します。")
            'Console.ReadKey()
        End Sub

639×389 => 250×152
イメージ
2023-08-23.png
/11KB
違反を報告
引用返信 削除キー/
■35498 / ResNo.4)  Re[3]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ KOZ 一般人(24回)-(2023/08/23(Wed) 05:54:27)
  • アイコン
    2023/08/23(Wed) 05:57:00 編集(投稿者)
    
    ■No35497に返信(ぱんださんの記事)
    
    CTRL+C を送ってキャンセルでいいんですかね?
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        Private cmdProcess As Process
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If cmdProcess IsNot Nothing Then Return
            TextBox1.Clear()
            cmdProcess = New Process
            cmdProcess.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
            cmdProcess.StartInfo.UseShellExecute = False
            cmdProcess.StartInfo.RedirectStandardOutput = True
            cmdProcess.StartInfo.RedirectStandardInput = False
            cmdProcess.StartInfo.CreateNoWindow = True
            cmdProcess.StartInfo.Arguments = "/c " & TextBox2.Text
            cmdProcess.Start()
            Task.Run(AddressOf ReadTask)
            Button1.Enabled = False
            Button2.Enabled = True
        End Sub
    
        Private Sub ReadTask()
            Dim reader = cmdProcess.StandardOutput
            Do Until reader.EndOfStream
                Dim buffer = reader.ReadLine()
                Invoke(Sub()
                           TextBox1.AppendText(vbCrLf & buffer)
                           Refresh()
                       End Sub)
            Loop
            cmdProcess.WaitForExit()
            cmdProcess.Dispose()
            cmdProcess = Nothing
            Invoke(Sub()
                       Button1.Enabled = True
                       Button2.Enabled = False
                   End Sub)
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            If AttachConsole(cmdProcess.Id) Then
                SetConsoleCtrlHandler(IntPtr.Zero, True)
                GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0)
                cmdProcess.WaitForExit()
                SetConsoleCtrlHandler(IntPtr.Zero, False)
                FreeConsole()
            End If
        End Sub
    
        Private Const CTRL_C_EVENT = 0
        Private Const CTRL_BREAK_EVENT = 1
    
        <DllImport("Kernel32")>
        Private Shared Sub GenerateConsoleCtrlEvent(dwCtrlEvent As Integer, dwProcessGroupId As Integer)
        End Sub
    
        <DllImport("Kernel32")>
        Private Shared Function AttachConsole(dwProcessId As Integer) As Boolean
        End Function
    
        <DllImport("Kernel32")>
        Private Shared Function SetConsoleCtrlHandler(HandlerRoutine As IntPtr, add As Boolean) As Boolean
        End Function
    
        <DllImport("Kernel32")>
        Private Shared Function FreeConsole() As Boolean
        End Function
    
    End Class
    

違反を報告
引用返信 削除キー/
■35501 / ResNo.5)  Re[4]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ ぱんだ 一般人(1回)-(2023/08/23(Wed) 21:05:09)
  • アイコン
    2023/08/23(Wed) 21:08:45 編集(投稿者)
    
    KOZさん
    
    早速ありがとうございます。
    
    複雑な処理が必要なんですね!
    サンプルコードを元に勉強していきたいと思います。
    本当にどうもありがとうございました。

違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -