它与您启动的应用程序如何运行和终止有关。一些程序启动另一个进程然后终止,其他程序继续运行。Calc.exe 和 Notepad.exe 会一直运行,直到您关闭它们。Write.exe 和任何因文件关联而启动的程序(例如,位图、波形文件、控制面板小程序等)实际上会启动另一个程序,然后启动它们的进程终止将控制权返回给批处理文件所以它可以执行下一行。
这里有些例子:
@echo off
echo Starting Calc.exe
calc.exe
echo Calc was closed by the user
echo Starting Notepad.exe
Notepad.exe
echo Notepad was closed by the user
echo Starting WordPad.exe
write.exe
echo Write launched WordPad and then terminated allowing the batchfile to continue
echo Starting Services.msc
services.msc
echo Windows launched MMC, opened services.msc, then returned control to the batchfile
echo Launching WMP via Chord.wav
c:\windows\media\chord.wav
echo Windows launched WMP, opened Chord.wav, then returned control to the batchfile
CMD 进程知道 Calc 和 Notepad 仍在运行,因为它自己生成了它们。CMD 进程不知道其他进程仍在运行,因为中间进程已终止。
要观察这一点,请打开Process Explorer并查看分层树中显示的进程。Calc.exe 和 Notepad.exe 都保留为运行批处理文件的 CMD 进程的子进程。Write.exe 和 MMC.exe (services.msc) 都成为顶级进程,不再是 CMD 进程的子进程。WMPlayer.exe 仍然是 svchost.exe 的子进程,这是 Windows 启动它的方式。CMD 进程不知道它们仍在运行,因为它没有启动它们,其他一些 Windows 进程做到了。所以执行继续......
另一个例子是 MSPaint.exe 的功能。如果您使用 Windows 内置的 BMP 文件关联来运行它,则 Windows 会启动 MSPaint.exe,并且控制权会立即返回到批处理文件。但是,如果您将 BMP 传递给 MSPaint.exe,则批处理文件会等待您关闭 MSPaint,然后再继续。(我在没有 BMP 的开发机器上,所以创建一个名为 C:\MyBitmap.bmp 的简单机器。)
@echo off
C:\MyBitmap.bmp
calc.exe
mspaint.exe C:\MyBitmap.bmp
notepad.exe
Calc.exe 将立即打开,Notepad.exe 将在您关闭 MSPaint.exe 的第二个实例之前打开。
我知道您没有询问有关通过文件关联启动 Windows 进程的问题,但它只是演示了拥有进程如何更改。如果 CMD 进程拥有已启动的进程,它应该等到它终止才能继续执行。如果生成的进程将控制权交给另一个进程,则 CMD 进程不知道孙进程,它会继续执行。