Запустите командную строку, например, приложение «Блокнот», и заблокируйте его, пока оно не будет закрыто.

Запустите командную строку, например, приложение «Блокнот», и заблокируйте его, пока оно не будет закрыто.

У меня есть пакетный скрипт, который, по сути, должен отображать пользователю окно блокнота с файлом конфигурации, который он может редактировать каждый раз при запуске скрипта, а также я хочу, чтобы командная строка ждала, пока эта программа будет закрыта, чтобы продолжить выполнение, и запускала программу, использующую этот файл конфигурации.

Я хочу сделать это, потому что не хочу принимать пользовательский ввод в пакетном скрипте с помощью команды «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

Связанный контент