![Запустите командную строку, например, приложение «Блокнот», и заблокируйте его, пока оно не будет закрыто.](https://rvso.com/image/1449111/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%83%D1%8E%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D1%83%2C%20%D0%BD%D0%B0%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%2C%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20%C2%AB%D0%91%D0%BB%D0%BE%D0%BA%D0%BD%D0%BE%D1%82%C2%BB%2C%20%D0%B8%20%D0%B7%D0%B0%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%20%D0%B5%D0%B3%D0%BE%2C%20%D0%BF%D0%BE%D0%BA%D0%B0%20%D0%BE%D0%BD%D0%BE%20%D0%BD%D0%B5%20%D0%B1%D1%83%D0%B4%D0%B5%D1%82%20%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D1%82%D0%BE..png)
У меня есть пакетный скрипт, который, по сути, должен отображать пользователю окно блокнота с файлом конфигурации, который он может редактировать каждый раз при запуске скрипта, а также я хочу, чтобы командная строка ждала, пока эта программа будет закрыта, чтобы продолжить выполнение, и запускала программу, использующую этот файл конфигурации.
Я хочу сделать это, потому что не хочу принимать пользовательский ввод в пакетном скрипте с помощью команды «set /P» и настраивать синтаксический анализ чтения и записи в этот файл конфигурации, который содержит много значений для проверки.
Я считаю, что стандартное поведение Windows при запуске любой исполняемой программы для файлов "exe" заключается в том, что программа открывается в собственном процессе и немедленно передается обратно скрипту/командной строке. Для файлов скриптов "bat" и "cmd" скрипт выполняется и ждет, пока управление не будет передано обратно первому скрипту или командной строке. Такое поведение должно быть, по крайней мере, при вызове другого скрипта с помощью команды "CALL" или при прямом вызове.
Теперь я считаю, что в Linux поведение по умолчанию для исполняемого содержимого, которое представляет собой как собственный машинный код, который может быть без расширения, так и скрипты, такие как файлы «sh», выполняется блокирующим образом, если только вы не укажете символ амперсанда («&») где-нибудь в строке ввода.
Поэтому я пытаюсь добиться блокирующего поведения в Windows, поскольку в Linux это сделать проще, и хотел бы, чтобы закрытие программы приводило к продолжению выполнения исходного скрипта или возвращению управления командной строке.
решение1
Вы можете использовать любой из нихstart
команда(обратите внимание на порядок /B /WAIT
переключателей)
start "" /B /WAIT notepad.exe "somefile"
или просто
notepad.exe "somefile"
Согласно ссылке выше:
При запуске 32-разрядного
GUI
приложения с графическим пользовательским интерфейсом ( )cmd
не ждет завершения работы приложения перед возвратом в командную строку.Такое поведение не происходит, если вы запускаете приложение из командного скрипта..
Редактироватьотносительно комментария Карана:Почему требуется /B?
/B
запускает приложение, не открывая новое окно командной строки.
- Честно говоря: если вы управляетеприложение с графическим пользовательским интерфейсомзатемнетоткрывается новое окно командной строки, даже если
/B
параметр пропущен. - С другой стороны, если вы запуститеинструмент командной строки, пропуск
/B
переключателя приводит к запуску этого инструмента в новом окне командной строки, котороезакроется немедленнопосле того, как он подойдет к концу ивесь его вывод потерян.
Поэтому я использую /B /WAIT
переключатели вместе, исходя из общего принципа: сохранять одинаковое поведение независимо от расположения запущенной программы и не думать об этом...
Добавкапо заказу /B /WAIT
переключателейс примерами и дополнительными ссылками со StackOverflow: start /WAIT /B
не работает ( /wait
аргумент игнорируется), хотя start /B /WAIT
работает...
решение2
notepad.exe | echo > NUL
Что это делает, так это открывает notepad.exe и весь его вывод перенаправляется в команду echo > NUL
. Чтобы перенаправить весь вывод, программа должна завершиться. Поэтому нам нужно дождаться завершения notepad.exe. Вывод отправляется в echo. Echo никак не использует ввод и просто выводит что-то в NUL. NUL — это стандартный поток Windows, который никуда не идет.
решение3
При написании вопроса мне в голову пришел один ответ, хотя он и не достигает того результата, который я предполагал.
Это было бы открыть любую программу, которую я хотел бы открыть, и добавить команду "pause" непосредственно после нее в строке ниже. Это приостановило бы выполнение скрипта на время, достаточное для того, чтобы пользователь закрыл новое окно программы, которое только что появилось, и ему нужно было бы понять, что ему нужно вручную продвинуть скрипт с этой точки. Pause выводит подсказку, объясняющую, что происходит, чтобы потенциально информировать пользователя (" Press any key to continue . . .
").
Это не является серьезной проблемой, если только скрипт не свернут по какой-либо причине, и пользователь не считает, что он завершился. Это также не очень хорошо, потому что он не возобновляет автоматически выполнение оставшейся части скрипта при закрытии программы, а это тот эффект, который мне нужен.
решение4
Вот что сработало у меня при запуске Firefox:
start "" /B /WAIT "G:\Programs\Mozilla Firefox\firefox.exe" | pause