2012-02-01 18 views
1

VB経由でバッチファイルを実行しようとしていますが、処理が完了するまで待つ必要があります。私が思っている問題は、バッチファイルを実行すると、バッチファイルではなくcmd.exeが開かれることです。続行する前にバッチファイルが閉じるのを待つ - VB.net

これが持つ問題イムは、それが完了する前に、それだけでping.batを削除することで、私はVB

 My.Computer.FileSystem.DeleteFile(My.Application.Info.DirectoryPath & "\PingCheck\machines.txt") 
    FileCopy(My.Application.Info.DirectoryPath & "\machines.txt", My.Application.Info.DirectoryPath & "\PingCheck\machines.txt") 

    Dim psi As New ProcessStartInfo(My.Application.Info.DirectoryPath & "\PingCheck\go.bat") 
    psi.RedirectStandardError = True 
    psi.RedirectStandardOutput = True 
    psi.CreateNoWindow = False 
    psi.WindowStyle = ProcessWindowStyle.Hidden 
    psi.UseShellExecute = False 

    Dim process As Process = process.Start(psi) 
    process.WaitForExit() 

    ProgressBar1.Value = ProgressBar1.Value + 2 
    FileCopy(My.Application.Info.DirectoryPath & "\PingCheck\machines.txt", My.Application.Info.DirectoryPath & "\machines.txt") 
    'My.Computer.FileSystem.DeleteFile(My.Application.Info.DirectoryPath & "\ping.bat") 
    MsgBox("Ping Check Complete") 

で実行していますものです。
私が呼び出したバッチファイルからプロセスを監視する方法を教えてください。それから終了したら、スクリプトを続けますか?

答えて

2

RHickeはここで、Run batch file in vb.net? VB.NETでバッチ処理を実行する方法の良い例を示して動作するはずです。

展開するには、WaitForExit()関数を使用して処理が完了するまで待つ必要があります。

Dim psi As New ProcessStartInfo("Path TO Batch File") 
psi.RedirectStandardError = True 
psi.RedirectStandardOutput = True 
psi.CreateNoWindow = False 
psi.WindowStyle = ProcessWindowStyle.Hidden 
psi.UseShellExecute = False 

Dim process As Process = Process.Start(psi) 

process.WaitForExit() 
+0

ありがとう、しかし、私はこれが働いていると確信していません。 これに合わせてスクリプトを微調整しましたが、完了していると思われる前にMessageBoxが表示されます。最初の投稿を参照してください – K20GH

+0

なぜですか?どの部分がうまくいかないと思いますか? –

+0

これは\ PingCheck \ go.batを実行するように指示し、完了する前にメッセージボックスを表示します。 実際にgo.batが実行され、pingテストのループが設定されているため、これらが完了するまで閉じることはありません。 – K20GH

1

System.Diagnostics.Processクラスを使用してバッチファイルを開始できます。プロセス参照は、HasExitedプロパティ(およびさらに興味深い情報)へのアクセスを提供します。 HasExitedプロパティは、プロセスが完了したかどうかを示します。

var process = System.Diagnostics.Process.Start(new ProcessStartInfo 
           { 
            FileName = "batch file path", 
            RedirectStandardError = true, 
            RedirectStandardOutput = true, 
            UseShellExecute = false, 
            Arguments = "parameters if applicable", 
            CreateNoWindow = true 
           }); 

while(!process.HasExited) 
{ 
    // obviously do some clever here to wait 
}  

コードは、C#であるが、原則はVB.NET

0

私はこれまで同様のことをしています。このコードは、System.Diagnostics.Process(rivethead_で説明)を使用してVB.Net内からRoboCopyを呼び出します。

Dim proc As System.Diagnostics.Process = New System.Diagnostics.Process() 

proc.EnableRaisingEvents = False 
proc.StartInfo.FileName = "d:\robocopy\robocopy" 
proc.StartInfo.Arguments = strSrcDir & " " & strDestDir & " " & strFile & " " & My.Settings.robocopyFlags 
proc.Start() 
proc.WaitForExit() 

それ以外の場合、ping.batは何をしていますか? 「ping」コマンドを実行するだけですか?もしそうなら、System.Diagnostics.Process(それを実行する.batファイルを呼び出す代わりに)を使って呼び出すこともできます。それは、あなたのプロセスをさらに制御するかもしれません。

+0

ping.batは実際にループしているので、元のping.batが別のコピーを開いた後に閉じてしまうことが考えられます。私はバッチファイルを書いていないので、それは非常に複雑です。私は言うことができません:( – K20GH

関連する問題