有,
我有两个批处理文件:BatchA.bat
,BatchB.bat
BatchA.bat
正在调用B1.bat
,B2.bat
,B3.bat
并同时运行三个批处理文件(三个批处理文件的运行顺序无关紧要)。
这是BatchA.bat
:
start B1.bat
start B2.bat
start B3.bat
BatchB.bat
正在调用B4.bat
,B5.bat
,B6.bat
并同时运行三个批处理文件(三个批处理文件的运行顺序无关紧要)。
这是BatchB.bat
:
start B4.bat
start B5.bat
start B6.bat
我正在使用C#控制台应用程序来呼叫BatchA.bat
,BatchB.bat
,但我需要确保BatchB.bat
在BatchA.bat
完成后才会启动。换句话说,我需要确保所有B1.bat
,B2.bat
和B3.bat
在我开始之前完成BatchB.bat
这是C#代码:
proc.StartInfo.FileName = BatchA.bat;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
proc.WaitForExit();
int exitCode = proc.ExitCode;
proc.Close();
Console.WriteLine("Process Complete! exitCode: " + exitCode.ToString());
proc.StartInfo.FileName = BatchB.bat;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
proc.WaitForExit();
exitCode = proc.ExitCode;
proc.Close();
Console.WriteLine("Process Complete! exitCode: " + exitCode.ToString());
当我运行它时,所有6个批处理文件同时启动。在完成所有三个小批量文件之前,如何确保BatchA.bat
不完整?
答案 0 :(得分:3)
执行此操作的一种简单方法可能是管道start
命令。当子进程结束时,管道的左侧部分将关闭,关闭整个管道并继续执行批处理
因此,batchA.cmd
可以编码为
@echo off
setlocal enableextensions disabledelayedexpansion
echo starting BatchA
(
start "b1" cmd /c b1.cmd
start "b2" cmd /c b2.cmd
start "b3" cmd /c b3.cmd
) | more
echo BatchA has ended
注意:这种方法虽然简单,但可能有缺点(或者不是,它取决于需要)。由b1
... b3
启动的流程可以使管道保持活动状态。
@Squashman已发布code以处理不等待从内部批处理文件启动的进程。
答案 1 :(得分:1)
这将在他们自己的窗口中并行启动所有三个批处理文件,并等待所有三个批处理文件在启动批处理之前完成。
@echo off
start "" /wait cmd /c batch1.bat |start "" /wait cmd /c batch2.bat |start "" /wait cmd /c batch3.bat
batchb.bat
答案 2 :(得分:1)
您可以使用WAITFOR
。在批处理A中,使用此:
@echo off
waitfor done
waitfor done
waitfor done
echo done
然后在B1,B2,B3中,当批次运行完毕时使用WAITFOR /SI done
。
或者,您可以在B1,B2和B3的每一个中创建一个0字节的标记文件作为监视器,检查是否存在任何在结束批处理A之前,但可能更复杂。
答案 3 :(得分:0)
我没有看到使用批处理文件执行此操作的方法。 "开始"命令启动一个进程,并为您提供 no 句柄,以检查进程是否完成,或等到它完成。
可以通过powershell命令执行此操作。
PS > $x = Start-Process notepad -PassThru
PS > Wait-Process -Id $x.Id
答案 4 :(得分:0)
尝试使用await和async。通过使用await关键字,您可以继续其他工作,直到BatchA完成。
例如,
higher Position
此处添加个人信息:https://msdn.microsoft.com/en-us/library/mt674882.aspx