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 中,但将它们的 stdout
和 stderr
记录到文件中(每个批处理文件一个)然后可以在批处理完成后启动复制:
@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 保持打开状态,因此您必须手动关闭它们中的每一个。
我有 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 中,但将它们的 stdout
和 stderr
记录到文件中(每个批处理文件一个)然后可以在批处理完成后启动复制:
@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 保持打开状态,因此您必须手动关闭它们中的每一个。