
コマンドプロンプトの出力をテキストボックスへ表示する方法について
現在、VBを使ったプログラミングを行っています。
以下に質問内容を示しますので、回答を宜しくお願いします。
<環境>
OS:Windows XP
開発ソフト:VB2008 express edition
質問:コマンドプロンプトの出力をテキストボックスへ表示する方法について
リダイレクトを使って、コマンドプロンプトの出力結果をVBのフォーム上(テキストボックス)
に表示したいのですが、常に出力が更新されるコマンドの場合、実行後にフリーズが起きてしまいます。
以下の例ではpingを送っていますが、テキストボックスには常にコマンドの出力結果が更新されません。(実行が終わるまで待つ必要がある)
理想としては、pingコマンドを実行したときの結果が、そのままテキストボックス上にリアルタイムに表示されることです。
リアルタイムにテキストボックスにコマンドプロンプトの結果を表示するには、
どのような設定が必要になるのでしょうか?
ご教授願います。宜しくお願いします。
----- 以下サンプルソース -----
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim results As String
Dim psi As New System.Diagnostics.ProcessStartInfo()
'ComSpecのパスを取得する
psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
'出力を読み取れるようにする
psi.RedirectStandardInput = False
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
'ウィンドウを表示しないようにする
psi.CreateNoWindow = True
'コマンドラインを指定("/c"は実行後閉じるために必要)
psi.Arguments = "/c ping 192.168.1.1"
'起動
Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
'出力を読み取る
results = p.StandardOutput.ReadToEnd
'出力された結果を表示
TextBox1.Text = results
'WaitForExitはReadToEndの後である必要がある
'(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit()
End Sub
End Class
No.3ベストアンサー
- 回答日時:
ReadToEnd だと、出力が終わるまで待ってしまうので、
ReadLine か、Read を使ってループすればよいかと思います。
回答ありがとうございます。
ReadLineを使用したところ期待の動作が得られました!
ありがとうございました。
ただ、ループの終了条件に悩んでいますが、もう少し考えてみようと思います。
(とりあえず今はカウンタを設定しています)
----サンプルソース----
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim results As String
Dim temp As String
Dim psi As New System.Diagnostics.ProcessStartInfo()
Dim cnt As Integer
cnt = 0
temp = ""
'ComSpecのパスを取得する
psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
'出力を読み取れるようにする
psi.RedirectStandardInput = False
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
'ウィンドウを表示しないようにする
psi.CreateNoWindow = True
'コマンドラインを指定("/c"は実行後閉じるために必要)
psi.Arguments = "/c ping 192.168.1.1"
'起動
Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
'Loop
Do
'出力を読み取る
results = p.StandardOutput.ReadLine
'出力された結果を表示
temp = temp + results
TextBox1.Text = temp
'すぐに返す
Application.DoEvents()
cnt = cnt + 1
Loop Until cnt = 100
'WaitForExitはReadToEndの後である必要がある
'(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit()
End Sub
End Class
No.2
- 回答日時:
これだけでテキストボックスの表示が
リアルタイムに変更できるかどうかは
不明ですが、経験でお答えします。
TextBox1.Text = results
の直後に
Application.DoEvents()
を入れるのは試されましたか?
No.1
- 回答日時:
今ひとついい実装にならないのでメモだけ。
http://msdn.microsoft.com/en-us/library/system.d …
と
http://msdn.microsoft.com/en-us/library/system.d …
を組み合わせる。
#イベントの方でTextboxに対して書き出していく。なんかMono 2.6.4の実装だとカーソルの位置によって出力の表示位置がおかしくなる。
#cmd /c 192.168.1.1だと何も表示されず、
#psi.FileName = "ping.exe";psi.Arguments = "192.168.1.1";なら表示された。
#一応心配しなくても、データすべてが飛んでくるまで他の作業が出来ないということはなさそうだった。
#リファレンスにも書いてあるがBeginOutputReadLine()と通常のReadLine()は併用できない。
#どうしてもStartとExitのメソッドを分けざるを得なくなるんで落ち着かないんだけど、解決策が見つからず断念。
#とかまぁそんなことがあって、自分でわかりやすくコードを回答したりはしないです。ごめんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2023/01/20 14:36
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 空白のセルを変更しようとした時(アクティブセル)に インプットボックスを5回出す インプットボックス 1 2023/03/14 11:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
プログラムについての質問です...
-
4Kの外部モニターに出力すると...
-
VBでステッピングモーターを動...
-
Accessのテーブルからcsv出力す...
-
COBOLで可変長ファイルの出力に...
-
標準出力の上書き
-
1ヶ月前の日時を取得
-
C#でアクセス権限の取得方法が...
-
printfとputcharの違いは
-
NSString文字列をprintfで出力...
-
1〜50まで順に数字を入力し、3...
-
cout と cerrの違い
-
CRC16計算について
-
クリスタルレポート8でのFormu...
-
クリスタルレポートで印刷時に...
-
ExcelマクロでIEのHP上のダウン...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
コンセントの電力は入力と出力...
-
センサーのタンパー出力について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
PD充電器について
-
cout と cerrの違い
-
スマホ充電器購入にあたり
-
Accessのテーブルからcsv出力す...
-
MMDでavi出力が出来ない
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
VBAでテキスト出力時のスペース...
-
ACCESS クエリ→フォーム...
-
coutで出力した文字を消去する...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
Windows Formアプリからコンソ...
-
コンセントの電力は入力と出力...
-
C#でアクセス権限の取得方法が...
-
【VBA】PDFを2in1で出力したいです
おすすめ情報