Это связано с тем, как приложение, которое вы запускаете пробегов и заканчивается. Некоторые программы запускают другой процесс, а затем завершаются, другие продолжают работать. 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, без ВМРА, таким образом, создать простое название 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 не знает о процессе внука и продолжает его выполнение.
Многие приложения win32 многопоточные и запускают и возвращают управление пакетному файлу. – foxidrive
@foxidrive: Как они возвращают управление пакетному файлу? –
Я говорю здесь о различиях между графическим интерфейсом и консольными приложениями. Они оба работают в своих процессах. Возможно, вы говорите о внутренних командах, таких как 'echo', которые действительно запускаются в' cmd.exe'. –