在继续之前等待批处理文件关闭 - VB.net

时间:2012-02-01 12:30:23

标签: vb.net

我正在尝试通过VB运行批处理文件,我需要等待它完成/退出才能进行。我相信我遇到的问题是,当执行批处理文件时,它会打开cmd.exe而不是批处理文件。

这是我用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")

我遇到的问题是它会在完成之前删除ping.bat 如何从我调用的批处理文件中监视进程。一旦它退出,继续脚本?

3 个答案:

答案 0 :(得分:3)

RHicke在这里展示了如何在VB.NET中运行批处理的一个很好的例子,Run batch file in 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()

答案 1 :(得分: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中起作用

答案 2 :(得分: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文件来执行此操作)。这可能会让您更好地控制您的流程。