• ベストアンサー

Shell関数からバッチファイルを起動後に、バッチファイルが終了するまで待ちたい。

はじめまして。 掲題の通り、VB.netからshell関数を用いてバッチファイルを起動します。 その後、そのバッチファイルが終了してログファイルの出力を完了した後に、 ファイルを開いて確認したいのです。 thread.sleepなどで大体このくらいかなという時間を待ってみる、 などのやり方しか今は思いつかないのですが、 何か明確にバッチファイルの終了を受け取れる方法は無いものでしょうか。 どなたかご存知の方がいらっしゃいましたらご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

Shell関数より Processクラスで実行したほうが簡単に待てますよ Dim oPro as Process oPro = Process.Start("..\..\a.bat") oPro.WaitForExit() MessageBox.Show("Hello") といった具合です

gawein193
質問者

お礼

ご回答ありがとうございます。 上記のように実装したところ、簡単にできました! Processクラスですか、知りませんでした。 Processクラスについてもう少し調べてみますね。 ありがとうございました!

その他の回答 (4)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

参考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 "バッチが終わりました。" バッチファイルのパスは実際の環境に合わせて記述してください。

回答No.4

すでに答え自体は出ていますが、ちょっと調べてみた感じだと、ほぼ 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使うまでもありません。

gawein193
質問者

お礼

ご回答ありがとうございます。 やはりそうなのですか。 私もがんばって他のやり方も試してみたものの いろいろ怒られてしまって。 Processクラスでうまくいきました。 ありがとうございました。

  • kikujack
  • ベストアンサー率47% (17/36)
回答No.2

下記のコードを実行してみてください。 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

gawein193
質問者

お礼

ご回答ありがとうございます。 上記の通りにやってみましたところ、 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) の行にて以下のエラーとなりました。 PInvoke 関数 'WindowsApplication1!WindowsApplication1.Form1::OpenProcess' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。 なんのことでしょうか。現在調査中です。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

Shell関数ではなく、WSHのRun、Execメソッドを使ってみては? http://msdn.microsoft.com/ja-jp/library/cc364421.aspx http://msdn.microsoft.com/ja-jp/library/cc364356.aspx

gawein193
質問者

お礼

ご回答ありがとうございます。 WSHとはいったいなんなのでしょうか? このサイトに行き同様のコードを記述してみても wscriptでコンパイルエラーとなってしまいます。 wscriptが何をImportsすればいいものなのか、調べても わからない状況です。 もう少し調べてみます。

関連するQ&A

  • Shell関数はOSに依存?

    現在VB4からVB6へのコンバージョン作業を行っています。 その際、 VB4→Windows98 VB6→Windows2000XP と、異なるOSを使用しています。 VB6の環境では、Shell関数を使用してMS-DOS バッチ ファイルの起動を行えるのですが、VB4の環境では同じコーディングでもバッチファイルが起動しない&エラーが出力されませんでした。 現在はVB4の環境をWindows95へ移す事で問題を回避したのですが (VB4の環境は比較テストに使用するだけでしたので) 98だから使えないと言うのも気持ちが悪く、質問させていただきました。 どなたかShell関数の上記点への対応策等ご存知でしたらご教授願います。

  • shell関数について

    毎度、お世話になっています。 現在、C言語で書いた複数のプログラムをBATファイルで処理するように記述しています。VBでその制御を行っているのですが、VBの処理手順として子フォーム(textあり)にデータを書きこんで、ボタンを押すとshellでbatファイルを起動し、バッチファイルの結果として、あるディレクトリにresult.txtが作成され、VBで他の子フォームに読みとらせようとしているのですが、shellだと、実行の終了を待たずに次にいってしまうので、そのバッチファイルの実行処理が終わらず、result.txtの内容を読み込むことができません。 待つようにするにはどうすればよいのでしょうか? ちなみにVBは一週間前にはじめて、自分でも調べてなんとか作ろうとしたのですが、時間がないため、ここに質問させていただきました。なるべく簡単なアルゴリズムで、よろしくお願いします。 VBのプロセス    テキストにデータを書き込む      ↓     ボタン   →        テキストの内容を*.txtとして保存                        ↓                      バッチファイル起動    ↓(ここで右の実行を待たない     ↓     ので読み込むことができない)   C言語で書かれたプログラム実行                        ↓ result.txtを    ←        結果としてresult.txtが出来上がる 読み込んで表示     

  • バッチファイルについて・・・

    バッチファイルというのはVBから操作できないのですか? Shellを使っているのですが、うまくいきません。 バッチファイルをダブルクリックするとうまくいくのです。。。

  • 外部ファイルを実行するには?

    お世話になります。 vb6で外部のバッチファイルを起動して、それを動作させようとしているのですが、うまくいきません。特にエラーにはならず、一瞬DOSプロントは立ち上がるんですが、バッチ処理しているログにはなにも書き込まれません。普通にバッチファイルをダブルクリックさせるか、コマンドからバッチファイルの入っているフォルダまでいって、バッチファイルを実行すれば書き込まれるのですが。 どこがまちがっているのでしょうか?shellじゃなくて、違う関数を使わなければいけないのでしょうか?ご教授よろしくお願いします。 なお、vb6でテストするときは▸マークの実行を押して、テストしました。 サンプル用のものです。 ↓test 現在の時間をログに記入 ■バッチファイルの中身(test.bat) echo test >> log.txt time/t >> log.txt ■vb6のファイルの中身 Private Sub Command1_Click() Dim ret as long ret = shell("cmd.exe /c C:\test\test.bat",4) End Sub

  • Shell関数で起動したメディアプレーヤーを終了したい。

    以前このコーナーで質問して教えて頂いたShell関数でメディアプレーヤーを起動できました。(以下にそのコーディングを記載しました) 今度は起動したメディアプレーヤーをVBから終了する方法が知りたいのですが教えて頂けませんか。 Shell ("C:\Program Files\Windows Media Player\wmplayer.exe /1 G:\TEST.wma ,vbMinimizedFocus") 宜しくお願いします。

  • Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。

    Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。 以下のように、shell関数で、既存のExcelファイルを起動させました。 どうすれば、Excelファイルを終了できますか? 宜しくお願いします。 Dim fl_name As String fl_name = "C:\XE2.xls" Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE " & fl_name, vbNormalFocus

  • Shell関数の終了を調べる方法

    Shell()関数を使ってほかのアプリケーションを起動し、終了を待つというよくある件なのですが、 ちょっと古くて、VB4.0の16ビット版による開発で、 動作環境はWindosXP(32ビット)です。 下記のように記述していますが、Shellの戻り値が&HFFFFを超えるためか、うまくいかないときがあります。 Private Declare Function GetModuleUsage Lib "Kernel" _ (ByVal hModule As Integer) As Integer Private Sub Command1_Click() Dim hInst As Integer hInst = Shell("calc.exe", vbNormalFocus) While GetModuleUsage(hInst) <> 0 DoEvents Wend MsgBox " 終了しました ", vbInformation End Sub ただしWindows98でも動作する必要があるので、32ビットにしてしまうというのはなしです。 どのようにしたらうまくいくのでしょうか? アドバイスください。お願いします。

  • WSHで他のバッチを呼びその終了を待つ方法

    WSHでプログラミングをしています。 WSHを使う理由はWin上から簡単にメールを送信できるのでとりあえず選択しました。 で、WSHのバッチから、普通のDOSコマンドで記述したバッチを呼んで、そのバッチの結果出力されたログファイルをWSHのバッチでメールに添付して送信したいなどと思っています。 今は var ws = WScript.CreateObject("Wscript.Shell"); ws.run("tmp.bat"); こんな感じで「tmp.bat」という名のDOSコマンドのバッチを呼び出しているのですが、このコマンドは命令発行したらその命令が終了するのを待たず次の命令に進んでしまうようです。 なので、ログ作成とメール送信のタイミングが合わない状態です。 処理待ちする方法を教えてください。よろしくお願いします。

  • バッチファイルの同時起動を防ぎたい

    現在バッチファイルを二つ(A,B)作っております。 Aというバッチファイルを実行し完了するまで、Bというバッチファイルを実行させないようにしたいです。(逆も同様に) バッチの処理完了時間はA,B共に15秒~30秒程です。 いろいろと調べてみたのですがバッチの最初にロックファイルを作成し、実現しようかと思っています。(バッチ終了時にはロックファイルを消す処理も入れます。) また、ロックファイルを作成した後に意図せずwindowsが落ちた場合、ロックファイルが削除されず、ロックされたままになってしまう可能性もあると知りました。この場合ファイルのタイムスタンプを作成し、ロックファイルの更新日時と現在時刻の差分が1分以上ならば異常な処理があったとみなし、ロックファイルを削除をしようと考えています。 ここで質問なのですが、ロックファイルの作成はできたのですが、更新日時と現在時刻の差分をバッチで記述する方法がわかりません。調べはしたのですが、いまいちよくわからず。 どなたか、サイトまたはソースをご教授願います。 環境はwindows10です。

  • バッチファイルでファイル数計算

    現在仕事で一日に大量のファイルが作成され、それの集計を行っています。ですので、そのファイルの集計を行えるバッチファイルを作成していますが、思ったものができません。 特定のファイル数の集計は行えるのですが、作成された時間おきに集計できるようにしたいんです。 例えば、 9:00に2ファイル作成された バッチファイル実行→ログには9:00分が出力 (ファイル名及びファイル数2がログとして出力) 10:00には50ファイル作成された バッチファイル実行 ↓ ログに以下が出力 9:00に出力分 10:00に出力分(ファイル名及びファイル数が50としてログ に出力) このようなことをバッチファイルで作成する事は無理でしょうか? ご助言宜しくお願い致します。