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