Запропонуйте командному рядку запустити таку програму, як «Блокнот» та заблокувати її, поки її не закриють


4

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

Я хочу це зробити, тому що я не хочу приймати введення користувача в Batch-скрипті з командним стилем "set / P" і мені потрібно налаштувати аналіз читання і запису в той файл конфігурації, який має багато значень для перевірки.

Я вважаю, що стандартна поведінка в Windows під час виконання будь-якої виконуваної програми - це для файлів "exe", вона відкриє програму в своєму власному процесі та негайно повернеться до сценарію / командного рядка. Для файлів сценаріїв "bat" та "cmd" він виконає скрипт і чекатиме, поки контроль буде переданий до першого сценарію чи командного рядка. Такою має бути поведінка, коли принаймні дзвонить іншому сценарію за допомогою команди "CALL" або викликає його безпосередньо.

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

Тому я намагаюся домогтися блокуючої поведінки в Windows, оскільки це легше здійснити в Linux, і я хотів би, щоб закриття програми викликало продовження оригінального сценарію або повернення контролю до командного рядка.

Відповіді:


6

Ви можете використовувати будь-яку 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
Чому / B потрібно?
Каран

Гарне доповнення щодо поведінки / B / WAIT. Мене кілька разів спіймало раніше, перш ніж я зрозумів, що замовлення має значення.
Тонні

1
notepad.exe | echo > NUL

Це робить це, він відкриває notepad.exe і весь його вихід перенаправляється на команду echo > NUL. Щоб перенаправити весь результат, програма повинна закінчити. Тому доводиться чекати, поки notepad.exe закінчиться. Вихід переходить у відлуння. Echo ні в якому разі не використовує вхід і просто виводить щось на NUL. NUL - це стандартний потік Windows, який нікуди не йде.


Принаймні, із Notepadd ++ командний рядок повертається негайно, перенаправлення незважаючи на це.
Пітер А. Шнайдер

@ PeterA.Schneider - так, ось у чому справа. Зазвичай віконна програма негайно повертається до командного рядка. Труба на відлуння змушує зачекати, поки програма закінчиться. Це саме те, про що писав Писис.
Валентин

Я хотів подати заявку після того, як перевірив, що це працює навіть із Notepad ++, але спочатку потрібно було відредагувати. Не соромтеся відкотити це, якщо вам це не подобається. Я подаю пропозицію, як тільки редакцію було розглянуто.
Пітер А. Шнайдер

0

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

Було б відкрити будь-яку програму, яку я хотів відкрити, і додати команду "пауза" безпосередньо після цієї в рядку нижче. Це дозволить призупинити виконання сценарію, поки користувач не закриє щойно з’явилося нове вікно програми, і йому слід усвідомити, що їм потрібно вручну просувати скрипт з цього моменту. Пауза роздруковує підказку з поясненням того, що відбувається, щоб потенційно повідомити користувача (" Press any key to continue . . .").

Це не є основною проблемою, якщо сценарій з будь-якої причини мінімізований, і користувач вважає, що його закінчили. Це також не чудово, тому що він автоматично не відновлює запуск решти скрипту, коли програма закрита, і це саме той ефект, який я хочу.


0

Спрощена відповідь у пакетному сценарії чи підказці:

cmd / c notepad.exe деякий файл


Це не дає наміченої поведінки. Блокнот від'єднаний від другого примірника CMD, який негайно переходить до першого CMD, який буде щасливо продовжуватися, не чекаючи блокнота.
Тонні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.