3

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

Я хочу сделать это, потому что я не хочу принимать пользовательский ввод в пакетном сценарии со стилем команды "set /P" и должен настроить чтение и запись при разборе этого файла конфигурации, который имеет много значений для проверки.

Я полагаю, что стандартное поведение в Windows при выполнении любой исполняемой программы заключается в том, что для исполняемых файлов она будет открывать программу в своем собственном процессе и немедленно возвращаться к сценарию / командной строке. Для файлов сценариев "bat" и "cmd" он выполнит сценарий и будет ждать, пока управление не будет передано первому сценарию или командной строке. Это должно быть поведение, по крайней мере, при вызове другого скрипта с помощью команды "CALL" или при непосредственном вызове.

Теперь в Linux я считаю, что поведение по умолчанию для исполняемого контента, который является как собственным машинным кодом, который может поставляться без расширения, так и сценариями, такими как файлы "sh", выполняется блокирующим образом, если вы не укажете символ амперсанда ("&") где-то в строке ввода.

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

4 ответа4

5

Вы можете использовать любую команду 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 работает ...

1
notepad.exe | echo > NUL

Что он делает, так это открывает notepad.exe и весь его вывод перенаправляется в команду echo > NUL . Чтобы перенаправить весь вывод, программа должна завершиться. Поэтому мы должны дождаться завершения notepad.exe. Вывод идет в эхо. Эхо никак не использует ввод, а просто выводит что-то в NUL. NUL - это стандартный поток Windows, который не идет никуда.

0

При написании вопроса, один ответ пришел ко мне, хотя он не достигает точного результата, который я намеревался.

Было бы открыть любую программу, которую я хотел открыть, и добавить команду "пауза" сразу после этой в строке ниже. Это приостановило бы выполнение сценария до тех пор, пока пользователь не закроет новое окно программы, которое только что появилось, и должно было бы понять, что ему нужно вручную продвигать сценарий с этой точки. Пауза распечатывает подсказку, объясняющую, что происходит, чтобы потенциально информировать пользователя (« Press any key to continue . . . »).

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

0

Упрощенный ответ в пакетном сценарии или подсказке:

cmd /c notepad.exe somefile

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .