tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルbatファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12599
投稿日: 2008/06/21(Sat) 08:45
投稿者サチコ
はじめまして、サチコと申します。

vbからの操作(ボタン押下)で
「a.txt」を
「1.bat」で読み込み
「1.bat」から出力された
「b.txt」の内容を
リッチテキストボックスへ表示するという処理を行っているのですが、
「1.bat」の終了を待たずに
「b.txt」の内容を取得しようとして
ファイルがないのでエラーになってしまい困っています。
こちらの掲示板の内容や、google検索などでのっている方法
(GetExitCodeProcessやsleepなど)は
試したのですが、どれもうまくいきません。

vbを使わずに「1.bat」をダブルクリックすれば「b.txt」が出力されること、
「b.txt」が既にある状態であれば、リッチテキストボックスへ内容が表示されること、
などから、うまくいってないのは「1.bat」の終了を待てていないからだと思ったんですが、
他に原因がありそうなら、ご指導ください。

よろしくお願い致します。

[ツリー表示へ]
タイトルRe: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12600
投稿日: 2008/06/21(Sat) 09:56
投稿者やじゅ
VB6では、Win32APIのWaitForSingleObject関数あたりかな
http://jeanne.wankuma.com/tips/vb6/process/waitforexit.html

[ツリー表示へ]
タイトルRe: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12602
投稿日: 2008/06/21(Sat) 12:42
投稿者K.J.K.
古いサンプルですが、
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/CnslBox2.lzh
というようなことですか?

[ツリー表示へ]
タイトルRe: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12606
投稿日: 2008/06/22(Sun) 13:26
投稿者サチコ
書き込みありがとうございます。

やじゅさん、K.J.K.さんに教えて頂いた方法ではうまくいきませんでした。

b.txtが出力されるフォルダを開いて監視しながら、
実行してみると
b.txtが出力されているのに、「ファイルがない」とエラーがでています。
やはり、処理が並行して進んでるのが原因かと思うのですが・・

[ツリー表示へ]
タイトルRe: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12607
投稿日: 2008/06/22(Sun) 18:01
投稿者K.J.K.
> b.txtが出力されるフォルダを開いて監視しながら、

私のサンプルではそういうことはしていませんけど。

[ツリー表示へ]
タイトルRe^2: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12608
投稿日: 2008/06/22(Sun) 18:41
投稿者サチコ
> > b.txtが出力されるフォルダを開いて監視しながら、
>
> 私のサンプルではそういうことはしていませんけど

「1.bat」を実行した時に、
出力される「b.txt」の
「保存先のフォルダ」を開いた状態で、
実行すれば、そこに出力されたファイルが表示されますよね。
あなたの、サンプルとは全く関係ないところの話です^^;

[ツリー表示へ]
タイトルRe^3: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12611
投稿日: 2008/06/22(Sun) 20:45
投稿者K.J.K.
> あなたの、サンプルとは全く関係ないところの話です^^;

そのサンプルの中に、プロセスの終了を検知する部分が書いてあるのですけど。

[ツリー表示へ]
タイトルRe: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12612
投稿日: 2008/06/22(Sun) 20:57
投稿者K.J.K.
> そのサンプルの中に、プロセスの終了を検知する部分が書いてあるのですけど。

もっとも、出力を得ることを手軽に行いたいのならば、
wshom.ocx - "Windows Script Host Object Model"
を参照設定して、そこのクラスを組み合わせて使う方が遥かに楽でしょう。

[ツリー表示へ]
タイトルRe: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12613
投稿日: 2008/06/23(Mon) 13:19
投稿者
終了が検知できないなら1.batに教えてもらうとか。

1.[VB]ボタン押下
 ↓
2.[VB]処理中管理ファイル「A.dat」出力
 ↓
3.[VB]「1.bat」起動
 ↓
4.[VB]「A.dat」が存在している間待機
 ↓
5.[BAT]「a.txt」を読み込み「b.txt」を出力
 ↓
6.[BAT]「A.dat」を削除
 ↓
7.[VB]「b.txt」を読み込む

みたいな。
終わったかどうかではなくて処理中かどうかをチェックする感じですかね。

ファイルの存在チェックはDir関数だとファイルを掴む場合があるので
FileSystemObjectを使うといいかな?

[ツリー表示へ]
タイトルRe: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12615
投稿日: 2008/06/23(Mon) 13:51
投稿者いな
> うまくいってないのは「1.bat」の終了を待てていないからだと思ったんですが、

恐らく、ここのサンプルにあるような
他のプログラムの終了を待つ(Shell関数で起動した)
http://hanatyan.sakura.ne.jp/vbhlp/tap_PrgEnd.htm

で「1.bat」を待っていると思うんだけれども、
それでも待てない原因を探ったほうがいいかもなぁ

[ツリー表示へ]
タイトルRe^2: batファイルの終了を待つにはどうすればいいのでしょうか・・?
記事No12627
投稿日: 2008/06/24(Tue) 13:06
投稿者おー
いなさんのおっしゃるサンプルで昔こんなのを書いたことがありました。(サンプルのように簡潔ではないですが・・)

Public Declare Function GetExitCodeProcess Lib "kernel32" _
      (ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" _
      (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
      ByVal dwProcessID As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" _
      (ByVal hObject As Long) As Long
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const STILL_ACTIVE = &H103&

Private Sub Command1_Click()
'--------------------------------
  Dim dwProcessID As Long
  Dim hProcess As Long
  Dim lpdwExitCode As Long
  Dim ret As Long
'--------------------------------
  Dim strShell As String
  Dim strBatName As String 'バッチファイル名称

'-- a.bat起動 --  
  strBatName= App.Path & "\a.bat"
  strShell = "Cmd.exe /c " & strBatName
  
  dwProcessID = Shell(strShell, vbMinimizedNoFocus)
  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, dwProcessID)
  Do
    ret = GetExitCodeProcess(hProcess, lpdwExitCode)
    DoEvents
  Loop While (lpdwExitCode = STILL_ACTIVE)
  ret = CloseHandle(hProcess)

'-- a.bat終了後b.bat起動 --    
  strBatName= App.Path & "\b.bat"
  strShell = "Cmd.exe /c " & strBatName
  
  dwProcessID = Shell(strShell, vbMinimizedNoFocus)
  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, dwProcessID)
  Do
    ret = GetExitCodeProcess(hProcess, lpdwExitCode)
    DoEvents
  Loop While (lpdwExitCode = STILL_ACTIVE)
  ret = CloseHandle(hProcess)
End Sub

[ツリー表示へ]