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


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.