- ベストアンサー
Shell関数からバッチファイルを起動後に、バッチファイルが終了するまで待ちたい。
はじめまして。 掲題の通り、VB.netからshell関数を用いてバッチファイルを起動します。 その後、そのバッチファイルが終了してログファイルの出力を完了した後に、 ファイルを開いて確認したいのです。 thread.sleepなどで大体このくらいかなという時間を待ってみる、 などのやり方しか今は思いつかないのですが、 何か明確にバッチファイルの終了を受け取れる方法は無いものでしょうか。 どなたかご存知の方がいらっしゃいましたらご教授ください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Shell関数より Processクラスで実行したほうが簡単に待てますよ Dim oPro as Process oPro = Process.Start("..\..\a.bat") oPro.WaitForExit() MessageBox.Show("Hello") といった具合です
その他の回答 (4)
- nda23
- ベストアンサー率54% (777/1415)
参考URLの上の方にあると思いますが、Windows Scripting Host の略です。 http://msdn.microsoft.com/ja-jp/library/cc364455.aspx Scriptの中で、色々な機能を実施する場合、お世話になるモノです。 試しに以下のコードを実行してみてください。 MsgBox "バッチを始めます。" CreateObject("WScript.Shell").Run "C:\~\hoge.bat", 1, True MsgBox "バッチが終わりました。" バッチファイルのパスは実際の環境に合わせて記述してください。
- K-Sogacchi
- ベストアンサー率53% (50/93)
すでに答え自体は出ていますが、ちょっと調べてみた感じだと、ほぼ ANo.3のredfox63氏が書かれたProcessクラスを使った方法の一択っぽいですね。 ANo.1の方法については、リンク先に書かれてるのはVB6の記述方法で、 .NETで使うには多少コンバートしないといけません。 おまけに、Option Strict On の設定だと、WScript.Shellのメソッドを書こうとしても 遅延バインディングだと怒られてしまいます。 ANo.2で書かれているソースもVB6用で、Declareで書かれているAPIの定義について、 VB6とVB.NETでは変数のサイズも変更されていたりするので、引数の長さが違うので 変だよ、と怒られている感じです。 As Long を As Integer に変更すれば怒られなくなるかもしれませんが… ともあれ、簡単に出来る手段が標準で与えられているので、それを使わない手はありませんね。 ちなみに、拡張子に関連付けての実行も、Processクラスを使用すれば出来ます。 これもAPI使うまでもありません。
お礼
ご回答ありがとうございます。 やはりそうなのですか。 私もがんばって他のやり方も試してみたものの いろいろ怒られてしまって。 Processクラスでうまくいきました。 ありがとうございました。
- kikujack
- ベストアンサー率47% (17/36)
下記のコードを実行してみてください。 Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Const PROCESS_QUERY_INFORMATION = &H400 Const STILL_ALIVE = &H103 Private Sub Command1_Click() Dim pid As Long pid = Shell("c:\a.bat", vbNormalFocus) hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) Do Call GetExitCodeProcess(hProcess, ExitCode) DoEvents Loop While ExitCode = STILL_ALIVE Call CloseHandle(hProcess) MsgBox ("ok") End Sub
お礼
ご回答ありがとうございます。 上記の通りにやってみましたところ、 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) の行にて以下のエラーとなりました。 PInvoke 関数 'WindowsApplication1!WindowsApplication1.Form1::OpenProcess' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。 なんのことでしょうか。現在調査中です。
- nda23
- ベストアンサー率54% (777/1415)
Shell関数ではなく、WSHのRun、Execメソッドを使ってみては? http://msdn.microsoft.com/ja-jp/library/cc364421.aspx http://msdn.microsoft.com/ja-jp/library/cc364356.aspx
お礼
ご回答ありがとうございます。 WSHとはいったいなんなのでしょうか? このサイトに行き同様のコードを記述してみても wscriptでコンパイルエラーとなってしまいます。 wscriptが何をImportsすればいいものなのか、調べても わからない状況です。 もう少し調べてみます。
お礼
ご回答ありがとうございます。 上記のように実装したところ、簡単にできました! Processクラスですか、知りませんでした。 Processクラスについてもう少し調べてみますね。 ありがとうございました!