コマンドプロンプトを終了せずにリダイレクトするには?
VBからコマンドプロンプトを操作し、結果をLabelに貼り付けることを考えています。
しかし、コマンドプロンプトを起動するプロセスにリダイレクト設定をしたところ、実行するたびに終了してしまい、その後のコマンド入力でプロセスが見つからずエラーとなってしまいます。コマンドプロンプトは終了せずにリダイレクトの設定する方法を教えて頂けないでしょうか。
また、コマンドプロンプト自体は表示させずに実行できるのが理想なので、やり方のヒントだけでも頂けると助かります。
操作例(VBのボタンから):cmd.exe起動 → cd c:\ → dir
エラー内容:プロセス 'c:\windows\system32\cmd.exe' が見つかりませんでした。
動作環境:VB2005、Windows XP
==============================
Public Class Form1
Private Sub Button19_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button19.Click
Dim P1 As New System.Diagnostics.Process
P1.StartInfo.UseShellExecute = False
P1.StartInfo.RedirectStandardOutput = True
P1.StartInfo.FileName = "cmd.exe"
P1.Start()
End Sub
Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
AppActivate("c:\windows\system32\cmd.exe")
SendKeys.SendWait("CD c:\{Enter}")
Label5.Text = P1.StandardOutput.ReadToEnd()
End Sub
Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
AppActivate("c:\windows\system32\cmd.exe")
SendKeys.SendWait("DIR{Enter}")
Label5.Text = P1.StandardOutput.ReadToEnd()
End Sub
No.6ベストアンサー
- 回答日時:
>IO.StreamReader実行前にSystem.Threading.Thread.Sleep(300)を行えばLabelに表示することが出来ました!
>これはSendKeys.SendWaitの完了前にIO.StreamReaderが実行されていたということでしょうか???
そうみたいですね。
SendKeys.SendWait("DIR > " & ret & "{Enter}")
Using sr As New IO.StreamReader(tmp, System.Text.Encoding.Default)
の間が余りにも早く空のファイルをオープンしてしまっていたのでしょう。
いっその事、ファイルオープン前に0.3秒待つと言う不確実なことをせず
Try
If FileLen(tmp) > 0 Then
Using sr As New IO.StreamReader(tmp, System.Text.Encoding.Default)
Label1.Text = sr.ReadToEnd() '←何も表示されない
Console.WriteLine(sr.ReadToEnd) '←何も表示されない
End Using
Exit While
Else
System.Threading.Thread.Sleep(300)
End If
ファイルサイズを確認して書き込みが始まっているか確認してオープンの方がすっきりするような気がします。
書き込み中で有ればオープンに失敗しますのでリトライします。
>あとはどうやってコマンドプロンプトのコンソールを表示させずに動作させるかです^^;;;
ん?
私はてっきり、コマンドプロンプトに表示したいが為にこのような事をしているのだと思っていました。
理由は分かりませんが。
コマンドプロンプトに表示したくないのであれば
Dim sb As New System.Text.StringBuilder
For Each s As String In IO.Directory.GetFiles("z:\")
sb.AppendLine(s)
Next
Label1.Text = sb.ToString
これがVBの正当な書き方です。
回答ありがとうございます。
なるほどファイルサイズで確認すればシンプルになりますね。勉強になります。
コマンドプロンプトの非表示については誤解を与えてしまったようで申し訳ありません。
作りたいのはVBとコマンドプロンプトを連携させて、VBからコマンドプロンプトの機能を使うアプリです。入出力はVBから行い、バックグラウンドでコマンドプロンプトが動いているというイメージでした。
直にVBで実行させるとなったときに、提示頂いたソースを参考にさせていただきます。
長くお付き合いいただきありがとうございました。
No.7
- 回答日時:
NO2です
回答した後にふと思いつきました。
SendKeys.SendWait("DIR > " & ret & "{Enter}") '←tmpファイルは作成される
SendKeys.SendWait("CLS{Enter}")
CSLで画面を消してしまえば
コマンドプロンプトのコンソールを表示させずに動作
が可能かと・・
No.5
- 回答日時:
No2 です
>ご指示頂いたソースの流れとしては、cdやdirコマンドを実行するたびに結果をtmpファイルに出力し、
>それをコンソール上に出力するものだと思います。コンソールではなくLabelに出力できれば問題解決できそうなので引き続き解析してみます。
テストで試したものをアップしましたので
コンソールに出力しましたが
Labelに出力は質問者様のコードの通り
'Label5.Text = P1.StandardOutput.ReadToEnd()
Label5.Text = sr.ReadToEnd
と殆ど変りません。
この回答への補足
IO.StreamReader実行前にSystem.Threading.Thread.Sleep(300)を行えばLabelに表示することが出来ました!これはSendKeys.SendWaitの完了前にIO.StreamReaderが実行されていたということでしょうか???
お陰で目的のことは出来るようになりました。ありがとうございます。
あとはどうやってコマンドプロンプトのコンソールを表示させずに動作させるかです^^;;;
返答遅くなり申し訳ありません。
IO.StreamReader実行時にエラーとなりConsole.WriteLineが実行されていなかったのですが、これは後からつけた「""」が原因だったようで、Console.WriteLineをなくせば実行されることが分かりました。ただ、なぜかコンソールには何も表示されず、当然Labelにも表示されないので引き続き調査しております。
現在下のソースで原因究明しております。お気づきの点あればご指摘いただけないでしょうか。
[コマンドプロンプト表示-DIR実行]
C:\Documents and Settings\・・・\bin\Debug>DIR > "C:\Documents and Settings\・・・\Temp\tmp856.tmp"
C:\Documents and Settings\・・・\WindowsApplication1\bin\Debug>
====================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
AppActivate("c:\windows\system32\cmd.exe")
Dim tmp As String = My.Computer.FileSystem.GetTempFileName
Dim ret As String = ControlChars.Quote & tmp & ControlChars.Quote
SendKeys.SendWait("DIR > " & ret & "{Enter}") '←tmpファイルは作成される
While True
Try
Using sr As New IO.StreamReader(tmp, System.Text.Encoding.Default)
Label1.Text = sr.ReadToEnd() '←何も表示されない
Console.WriteLine(sr.ReadToEnd) '←何も表示されない
End Using
Exit While
Catch ex As Exception
System.Threading.Thread.Sleep(300)
End Try
End While
IO.File.Delete(tmp)'←tmpファイルは削除される
End Sub
No.4
- 回答日時:
No.2です。
失礼しました。
Dim ret As String = ControlChars.Quote & My.Computer.FileSystem.GetTempFileName & ControlChars.Quote
でどうでしょうか。
Tempフォルダーのパスにスペースが含まれている環境の時は、
エラーになります。
ファイル名の前後に""を付けて回避します。
No.3
- 回答日時:
ただコマンドの結果を取得したいだけなら、
コマンドとその引数をStartInfo.Argumentsの中にいれれば取得できますよ。
それと非表示はStartInfo.WindowStyle = ProcessWindowStyle.Hiddenで出来ます。
参考URL:http://dobon.net/vb/dotnet/process/standardoutpu …
回答ありがとうございます。
以下のようにArgumentsプロパティを記述すれば取得できることは何とか分かったのですが、これだと一つのコマンドを実行するたびにcmdを再起動しなければいけないので困っていました。
cmdを再起動することなく、コマンドを自由に変える方法を探しています。
またお気づきの点あればよろしくおねがいします。
P1.StartInfo.Arguments = "/c dir > c:\test\cmd.txt"
P1.StartInfo.FileName = "cmd"
あと非表示としてしまうと、その後の処理が実行できなくなってしまっています。下の処理を行うためにはアクティブにしないといけないようで、そのためには表示させなければならず、何か方法はないものかと・・・。
AppActivate("c:\windows\system32\cmd.exe") ←対象が見つからない
SendKeys.SendWait("DIR{Enter}") ←ハンドルされない
No.2
- 回答日時:
P1.StartInfo.UseShellExecute = False
P1.StartInfo.RedirectStandardOutput = True
で、マンドプロンプトは終了してしまいます。
仕方がないので、
Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
Dim ret As String = My.Computer.FileSystem.GetTempFileName
AppActivate("c:\windows\system32\cmd.exe")
SendKeys.SendWait("CD c:\ >" & ret & "{Enter}")
While True
Try
Using sr As New IO.StreamReader(ret, System.Text.Encoding.Default)
Console.WriteLine(sr.ReadToEnd)
End Using
Exit While
Catch ex As Exception
System.Threading.Thread.Sleep(300)
End Try
End While
IO.File.Delete(ret)
End Sub
Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
AppActivate("c:\windows\system32\cmd.exe")
Dim ret As String = My.Computer.FileSystem.GetTempFileName
SendKeys.SendWait("DIR >" & ret & "{Enter}")
While True
Try
Using sr As New IO.StreamReader(ret, System.Text.Encoding.Default)
Console.WriteLine(sr.ReadToEnd)
End Using
Exit While
Catch ex As Exception
System.Threading.Thread.Sleep(300)
End Try
End While
IO.File.Delete(ret)
End Sub
は、どうですか?
ファイルに書き出すのが気に入らないと思いますが。
回答ありがとうございます。
リダイレクトなしでcmd.exeを実行した後、上記のメソッドを実行してみたところ以下のようなエラーが発生しました。
c:\test>DIR > C:\Documents and Settings\a-shishido\Local Settings\Temp\tmp4E4.tmp
指定されたパスが見つかりません。
c:\test>CD c:\ > C:\Documents and Settings\a-shishido\Local Settings\Temp\tmp4E5.tmp
指定されたパスが見つかりません。
VBに不慣れで原因解析に時間がかかってしまっているため先にご報告させて頂きました。
ご指示頂いたソースの流れとしては、cdやdirコマンドを実行するたびに結果をtmpファイルに出力し、
それをコンソール上に出力するものだと思います。コンソールではなくLabelに出力できれば問題解決できそうなので引き続き解析してみます。
No.1
- 回答日時:
実験も検証もしていませんが…、
cmd.exeのオプションに「/k」があります。
「コマンドを実行するが、終了しない」
というものです。
一度試してみてはいかがでしょう?
この回答への補足
コマンドプロンプトでコマンドを実行するたびにLabelに表示させるつもりでしたが、リダイレクトはアプリが終了した時点で初めて結果を転送する機能のような気がしてきました。
なのでリダイレクト設定をすると強制的にアプリ終了まで自動的に行われてるように思われます。
リダイレクト以外でLabelに表示させる方法も模索してみます。
回答ありがとうございます。
argumentsプロパティに「/k」を設定してみました。
結果は変わらずコマンドプロンプトは閉じてしまいます。
他にお気づきの点あればまたよろしくお願いします。
追加:P1.StartInfo.Arguments = "/k"
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access クエリ実行が急に非常に...
-
xismoについてです!開こうとす...
-
OLE又はDDEを使うVISUAL BESIC...
-
JavaScriptでコマンドプ...
-
64bit環境で32bitのodbc参照
-
コンパイル ./aと./a.out の違い
-
コマンドプロンプトで外のexeや...
-
VC++から引数付きexeファイルの...
-
Visual BASIC か...
-
ファイルアイコンの左下に緑の□...
-
JAVAのAPIのコールの仕方で質問...
-
VBAで他のプログラムが起動して...
-
jarファイルとjava.exeの関連付...
-
JavascriptからJSPファイル(~....
-
Delphi:実行形式ファイルのサイズ
-
JavaScriptでプロセスを終了さ...
-
MDBファイルをCSV出力したい
-
jarファイル実行時の環境変数の...
-
LINK : fatal error LNK1104に...
-
以下のように複数のファイルを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access クエリ実行が急に非常に...
-
JavaScriptでコマンドプ...
-
OLE又はDDEを使うVISUAL BESIC...
-
VC++から引数付きexeファイルの...
-
VBAでEXEファイルを動かす方法...
-
LINK : fatal error LNK1104に...
-
64bit環境で32bitのodbc参照
-
WScript.Echo と msgbox
-
batからexeを実行し戻り値を受...
-
VBAでMP3を鳴らしたい
-
コマンドプロンプトで外のexeや...
-
batからexeを起動した際の戻り...
-
VBS形式ファイル:ダブルクリッ...
-
jarファイル実行時の環境変数の...
-
JAVA .jarファイルに再圧縮する...
-
jarファイルとjava.exeの関連付...
-
VBSでEXCELのXLSTARTにあるマク...
-
コンポーネント`MSCOMM32.cox'...
-
ローカルのHTMLからexeファイル...
-
c/c++ ビルドしたにもかかわら...
おすすめ情報