我正在尝试通过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 如何从我调用的批处理文件中监视进程。一旦它退出,继续脚本?
答案 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)
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文件来执行此操作)。这可能会让您更好地控制您的流程。