Ответ 1
Это связано с тем, как запускаемое и завершаемое приложение запускается. Некоторые программы запускают другой процесс, а затем завершаются, другие продолжают работать. 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 перед продолжением. (Я на dev-машине без 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 не знает о процессе внука и продолжает его выполнение.