
コマンドプロンプトの出力をテキストボックスへ表示する方法について
現在、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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
COBOLのMOVEで桁数が異なる場合
-
Accessのテーブルからcsv出力す...
-
VBAのExecメソッドで画面を非表...
-
VB2005におけるバイナリファイ...
-
ACCESS フォームで選択したレコ...
-
エクセルVBAでテキストファイル...
-
コンセントの電力は入力と出力...
-
C#でアクセス権限の取得方法が...
-
CrystalReportの文字列の折返し...
-
cout と cerrの違い
-
【PowerPoint VBAの高速化】
-
ACアダプタの適合性・互換性に...
-
AccessでPDFを複数ファイルにし...
-
CRC16計算について
-
コマンドプロンプトの出力をテ...
-
手続き型言語、一般的な質問
-
プログラムについての質問です...
-
VC++ スタティックテクスト(Sta...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
Windows Formアプリからコンソ...
-
MMDでavi出力が出来ない
-
プログラムについての質問です...
-
Accessのテーブルからcsv出力す...
-
cout と cerrの違い
-
VBAのExecメソッドで画面を非表...
-
COBOLのMOVEで桁数が異なる場合
-
コンセントの電力は入力と出力...
-
アクセスでエクセルに出力する...
-
Excel VBAで値を変えながら、pd...
-
無線とかアンテナに関しの質問...
-
KEYENCEのシーケンスプログラム...
-
CRC16計算について
-
TV出力ポートをOFFにすれば良い...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
VBAでテキスト出力時のスペース...
-
coutで出力した文字を消去する...
-
makeで文字化けする。migwのmak...
おすすめ情報