Windows批处理:CMD结束后调用

Windows Batch: Call after CMD finishes

我有 Windows 10,在我的批处理文件中我执行以下操作:

start cmd /k "Build_x1.bat"
start cmd /k "Build_x2.bat"
start cmd /k "Build_x3.bat"
...
start cmd /k "Build_xN.bat"

我把它设为 start cmd 的原因是因为我希望它在新的 window 中打开;它们都在不同的时间和在它们自己的 window 中完成,它们输出它们自己的警告和正在编译的文件的错误。当他们完成时,他们会在我的目录中生成一个 .adb 文件。在同一个脚本中,我想将 *.adb 复制到另一个目录中。我遇到的问题 运行 是我不知道如何在上述所有 cmd 在它们自己的 window 中完成后才启动 xcopy。所以我想要:

start cmd /k "Build_x1.bat"
start cmd /k "Build_x2.bat"
start cmd /k "Build_x3.bat"
...
start cmd /k "Build_xN.bat"

xcopy /s/y *.adb "C:\*some directory*"

但 xcopy 仅在上述所有 start cmd 完成后。关于如何实现这一目标的任何想法?我尝试了几种方法,但都失败了,并且在文件准备好之前过早地尝试复制文件。

像您一样启动命令会在不同的 window 中启动它们,并且您会从父项中释放对它的控制。选项很少,您可以使用 start /b 一次启动它们,这将单独启动它们,但在同一个 window 中,但将它们的 stdoutstderr 记录到文件中(每个批处理文件一个)然后可以在批处理完成后启动复制:

@echo off
set "list=Build_x1.bat Build_x2.bat Build_x3.bat Build_xN.bat
for %%I in (%list%) do start "" /b "%%I">>"%%~nI.log" >2%1
xcopy /s/y *.adb "C:\*some directory*"

如果你想在运行末尾看到每个文件输出的结果:

@echo off
set "list=Build_x1.bat Build_x2.bat Build_x3.bat Build_xN.bat
for %%I in (%list%) do (
    echo **** Log for %%~I *** >>"%%~nI.log"
    start "" /b "%%I.bat">>"%%~nI.log" >2%1
)
xcopy /s/y *.adb "C:\*some directory*"
type Build Build*.log

或单独查看它们 windows:

@echo off
set "list=Build_x1.bat Build_x2.bat Build_x3.bat Build_xN.bat
for %%I in (%list%) do start "" /b "%%I.bat">>"%%~nI.log" >2%1
xcopy /s/y *.adb "C:\*some directory*"
for %%I in (%list%) do start "%%~nI" cmd /k type "%%~nI.log"

以标题开始他们并检查他们的windows。循环直到全部完成:

start "MyTitle" cmd /c "Build_x1.bat"
start "MyTitle" cmd /c "Build_x2.bat"
start "MyTitle" cmd /c "Build_x3.bat"
...
start "MyTitle" cmd /c "Build_xN.bat"
:loop
timeout 1
tasklist /fi "WindowTitle eq MyTitle" |find "cmd.exe" && goto :loop
echo all of them are finished

PS:如果这些批处理文件名与您的示例中的名称相同,您可以使用:

for /l %%i in (1,1,%n%) do start "MyTitle" cmd /c "Build_x%%i.bat"

注意:cmd /k 使 windows 保持打开状态,因此您必须手动关闭它们中的每一个。