Windows консоль не закрывалась

Как предотвратить закрытие командной строки после выполнения?

Моя проблема в том, что в Windows есть окна командной строки, которые закрываются сразу после выполнения. Чтобы решить эту проблему, я хочу, чтобы поведение по умолчанию состояло в том, что окно остается открытым. Обычно этого поведения можно избежать с помощью трех методов, которые мне приходят в голову:

  1. Поместите строку pause после пакетных программ, чтобы предложить пользователю нажать клавишу перед выходом
  2. Запуск этих командных файлов или других инструментов управления командной строкой (даже запуск службы, перезапуск и т. д. с помощью net start xy или что-то подобное) в пределах cmd.exe (Start — Run — cmd.exe)
  3. Запуск этих программ с помощью cmd /k следующим образом: cmd /k myprogram.bat

Но есть и другие случаи, в которых пользователь:

  1. Запускает программу в первый раз и не знает, что данная программа будет запущена в командной строке (Windows Command Processor), например. при запуске ярлыка из меню «Пуск» (или из другого места), OR
  2. Найти немного неудобно для запуска cmd.exe все время и не имеет времени /возможности переписать код этих команд всюду, чтобы поставить паузу после них или избежать выхода в явном виде.

Я прочитал статью об изменении поведения по умолчанию cmd.exe при открытии его явно, с созданием Запись AutoRun и управление его содержимым в этих местах:

(Элементы автозапуска _String values_ . )

Я поместил cmd /d /k в качестве значения, чтобы попробовать, но это не изменило поведение упомянутых материалов выше всего . Он просто изменил поведение окна командной строки при открытии его явно (Start-Run-cmd.exe).

Итак, как это работает? Можете ли вы дать мне какие-либо идеи для решения этой проблемы?

11 ответов

У меня есть решение, которое может применяться только к .cmd и .bat :

Откройте regedit и перейдите к каждому из них:

Теперь измените значение «Значение по умолчанию» на cmd.exe /k «%1» %* . Теперь каждое окно пакетного скрипта останется открытым после его выполнения.

Обратите внимание, что это похоже на использование cmd.exe /c cmd.exe /k program.bat , что означает, что другой экземпляр CMD будет запущен в родительский. Я не мог найти, как перезаписать первый аргумент /c .

Вы также можете сделать это с помощью [exefile] , но теперь он отобразит пустой консольный блок, если исполняемый файл имеет графический интерфейс.

Консоль закрывается, когда последний подключенный к ней процесс завершает работу или вызывает FreeConsole.

Другими словами, окно консоли Win32 всегда будет закрыто, когда последняя запущенная в нем программа выйдет, и вы не можете изменить это.

(Для 16-разрядных MS-DOS-программ Windows предлагает в диалоговом окне свойств параметр «Закрыть при выходе», но это не является исключением из вышеприведенного поведения: это процесс NTVDM, который закрывает окно. Кроме того, эта опция снова для каждой программы.)

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

1. Перейдите в папку, в которой находится ваш исполняемый файл. 2.Shift-Щелкните правой кнопкой мыши и выберите «Окно команд отсюда»
3.type в имени исполняемого файла и нажмите Enter
4. Процесс должен выполняться, но окно должно оставаться открытым.

cmd.exe /k даст вам проблемы с некоторыми партиями. Если пакет exit 1 (без /B ) ваша консоль будет закрыта. Трюк заключается в том, чтобы использовать:

Чтобы использовать это по умолчанию для всех пакетных файлов, установите HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default) и HKEY_CLASSES_ROOT\batfile\shell\open\command\(default) до «%windir%\system32\cmd.exe» /k «%windir%\system32\cmd» /c «%1» %* .

Я просто нажал на немое решение после прочтения ответа grawity .

Мой вариант использования — это настройка среды консоли на работе, где блокируются все более разумные решения. Все, что мне нужно, это установить PATH и настроить некоторые псевдонимы doskey и быть сброшенными в оболочку.

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

Читайте также:  Usb linux read only one

Вместо использования PAUSE (я предпочитаю CHOICE или TIMEOUT использовать PAUSE при необходимости), вы можете использовать это решение здесь: 886848 /как в изготовление витрины-пакетный файл пауза-когда-двойной щелчок .

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

Используя CHOICE, вы можете запрограммировать возможность выбора пользователем различных действий, и использование TIMEOUT позволяет закрыть окно после задержки (без присмотра). Если вы запускаете командный файл из окна командной строки, эти паузы могут быть раздражающими.

Связанное решение позволит вам решить, хотите ли вы пропустить паузы, если пакетный файл был запущен из окна командной строки.

Вы можете прочитать больше по предоставленной ссылке, но основы этого в том, что она использует переменную окружения:

, чтобы определить, был ли командный файл запущен из окна команд или нет.

Итак, вы используете его следующим образом:

В момент выхода командного файла вы добавите следующий код:

Лучший способ, который я нашел, чтобы обойти это, — вызвать ваши командные файлы из другого командного файла с помощью start.

, поэтому, если вы обычно запускаете файл с именем go.bat, тогда вы создадите второй командный файл с именем go2.bat

содержимое go2.bat будет просто

первое окно немедленно закрывается, но тот, который запускает ваш go.bat, остается открытым

Это работает для версии 5.00 редактора реестра Windows.

Сохраните указанные выше cmds в файле, который называется что-то вроде cmdbatfile-open.reg и выполните его!

Предположим, у вас есть два командных файла, которые вы хотите запустить в своем собственном экземпляре, и не открывайте их, если их исполняемый файл выйдет. Позволяет называть эти две партии A.bat и B.bat .

Теперь для простоты вы можете запустить пакетный файл для их обоих, назовем это launch_both.bat с содержимым:

Он может работать не так, как ожидалось, если вы вызываете exit в одном из двух пакетных файлов. Это нужно протестировать.

Для пользователей, использующих Windows 10, обратите внимание, что ни один из вышеперечисленных ответов не работает в Windows 10.

Для Windows 10, если у вас есть доступ к скрипту, вам нужно добавить следующий код в конце:

Этот код будет ждать ввода перед закрытием.

В ответ на пониженную PSIXO — «Этот ответ уже был рассмотрен в вопросе. — Ro Yo Mi Jan 20 ’16 at 5:06″ — Нет, не было. Предыдущие ответы были: «пауза», которая НЕ работала. Ответ PSIXO был: «& pause», который работает. Пожалуйста, проанализируйте более тщательно перед понижением. Я запускал это из приглашения IDLE, и он работал:

С другой стороны:

НЕ работал (запрос cmd перевернулся, и на самом деле вернул ошибку (1)). Спасибо PSIXO за ответ, который мне нужен. Генри.

Правильное не закрывающиеся консольное окно windows?

Уже достало это ..
Раньше просто писал
cin.get()
cin.get()
достало
system(“pause”)
getch()
тоже костыли !

Что еще есть ?
В идеале, чтобы с клавиатуры писать quit для выхода

Как это решается в серьезных проектах ?

P.S.Visual Studio 2015

  • Вопрос задан более трёх лет назад
  • 941 просмотр

Как это решается в серьезных проектах ?

Поставь себе Linux.

Раньше просто писал
cin.get()
cin.get()
достало
system(“pause”)
getch()
тоже костыли !

Ринат Велиахмедов:
Это проблема не языка и не компилятора или среды. Это проблема Windows.

И да, в линуксе как бы та же самая проблема

Я понимаю, что ты косишь под грамотного, но вот такие глупости тебя выдают с потрохами. 🙂

Во-первых, если у него возник вопрос про system() в конце, то ему до серьёзных проектов — как до Марса или даже как до альфы Центавра.
Во-вторых, никогда в программе не должна решаться проблема окружения. Делая system() в программе, чтобы она не закрывалась, человек признаёт, что он просто не знает, как правильно подготовить среду — не хватает знаний уверенного пользователя операционной системы.
В-третьих, в лине просто нет такой проблемы, потому что консоль сделана правильно. Там вообще много чего сделано правильно, поэтому для новичка будет полезно начинать именно на правильной учиться, если, конечно, он не хочет стать обычным знатоком всех ошибок Windows.

Читайте также:  Почистить папку с обновлениями windows

Вместо того, чтобы сейчас писать очередную программу, он пытается понять, как настроить среду, — это нерационально.

Как задержать окно консоли от закрытия?

в общем ребята в чем суть дела, я решил пройти книгу Б. Страуструп «Программирование. Принципы и практика использования С++», и нелепая ситуация 2 задача и все.Вот скрины.

Пробывал и так и этак, в общем ничего.

Скорочтение (как задержать консольное окно на определённое время?)
как задержать консульное окно на определёное время?

Задержать закрытие окна консоли после выполнения программы
Какой командой задержать экран C++ после выполнения программы, а то он сразу исчезает.

Как очистить окно консоли?
Здравствуйте! Есть к примеру программа — калькулятор а консоли! Она работает так, ввели число.

Как убрать окно консоли
Всем привет! Посмотрите как можно убрать черное окно чтобы осталась только окно диалога.

Под винду добавляют
system(«pause»);

Не занимайтесь ерундой.

Если вы пользуетесь Visual Studio и запускаете свою программу в пошаговом отладчике (Start Debugging — F5), то эта проблема вас вообще не должна интересовать.

Если же вы запускаете программу на полноценное выполнение (Start Without Debugging — Ctrl+F5), то консольное окно и так не должно закрываться при завершении программы. Если же оно у вас таки закрывается, то идите в настройки проекта ‘Linker -> System’ и исправьте настройку ‘SubSystem’ на ‘Console’. Окно перестанет закрываться само по себе, а будет просить вас нажать клавишу, как это делает системная команда «pause».

Т.е. не надо заниматься этой фигней с ‘system(«pause»);’ или . Все, что вам нужно, уже встроено прямо в Visual Studio.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

Как программно создать процесс, который создаёт окно консоли?
Имеется ввиду, конечно настоящее отдельное окно консоли. Вот создаваемый процесс: #include.

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

Windows консоль не закрывалась

Сообщения: 4537
Благодарности: 344

Сообщения: 51909
Благодарности: 14931

Конфигурация компьютера
Материнская плата: ASRock P4i65PE (5 PCI, 1 AGP, 4 DDR DIMM, Audio, LAN)
HDD: ST3200827A (200 ГБ) IDE
Звук: Creative SB Live! 5.1 Digital (SB0220) Sound Card
CD/DVD: NEC DVD_RW ND-3551A
Ноутбук/нетбук: Стационарный компьютер
» width=»100%» style=»BORDER-RIGHT: #719bd9 1px solid; BORDER-LEFT: #719bd9 1px solid; BORDER-BOTTOM: #719bd9 1px solid» cellpadding=»6″ cellspacing=»0″ border=»0″>
Конфигурация компьютера
Материнская плата: ASUS P8Z77-V LE PLUS
HDD: Samsung SSD 850 PRO 256 Гб, WD Green WD20EZRX 2 Тб
Звук: Realtek ALC889 HD Audio
CD/DVD: ASUS DRW-24B5ST
ОС: Windows 8.1 Pro x64
Прочее: корпус: Fractal Design Define R4
Читайте также:  Windows 10 enterprise ltsc original iso
Когда я его запускаю, на экране появляются и висят, пока не закрою, окно DOS и окно AVZ.

Это не окно DOS, а командная строка (cmd.exe выполняет файлы с расширением .cmd).

в командной строке Total Commander

Это сообщение посчитали полезным следующие участники:

Подскажите, пожалуйста: есть cmd-файл, состоящий из одной строки: avz.exe lang=en. Когда я его запускаю, на экране появляются и висят, пока не закрою, окно DOS и окно AVZ. »

——-
Как сказало Дерево Дровосеку: «я — пень».

Это сообщение посчитали полезным следующие участники:

Когда я его запускаю, на экране появляются и висят, пока не закрою, окно DOS и окно AVZ »

Запуск указанной программы или команды в отдельном окне.

START [«заголовок»] [/Dпуть] [/i] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME| /ABOVENORMAL | /BELOWNORMAL]
[/WAIT] [/b]
[команда/программа] [параметры]

«заголовок» Заголовок окна.
путь Рабочий каталог.
B Запуск приложения без создания нового окна с отключением
обработки сочетания клавиш ^C. Если приложение не
обрабатывает сочетание клавиш ^C самостоятельно,
единственным способом его прерывания является
использование сочетания клавиш ^Break.
I Новой средой станет исходная среда, переданная
cmd.exe, а не текущая среда.
MIN Запуск команды/программы в свернутом окне.
MAX Запуск команды/программы в развернутом окне.
SEPARATE Запуск 16-разрядной программы Windows в отдельной
области памяти.
SHARED Запуск 16-разрядной программы Windows в общей
области памяти.
LOW Запуск приложения с приоритетом IDLE.
NORMAL Запуск приложения с приоритетом NORMAL.
HIGH Запуск приложения с приоритетом HIGH.
REALTIME Запуск приложения с приоритетом REALTIME.
WAIT Запуск приложения с ожиданием его завершения.
ABOVENORMAL Запуск приложения с классом приоритета ABOVENORMAL
BELOWNORMAL Запуск приложения с классом приоритета BELOWNORMAL
команда/программа
Если это внутренняя команда cmd.exe или пакетный файл,
обработчик команд (cmd.exe) запускается с ключом /K.
Это означает, что окно не будет закрыто после завершения
команды.

Если это не внутренняя команда cmd.exe и не пакетный файл,
значит, это программа, которая будет запущена в графическом
или текстовом окне.

параметры Параметры, передаваемые команде/программе.

Изменения вызова внешних команд из командной строки или с помощью команды
START при включении расширенной обработки команд:

Для вызова неисполняемых файлов через механизм сопоставления типов файлов
достаточно просто ввести имя файла в командной строке. Например, команда
WORD.DOC запускает приложение, сопоставленное расширению имени файла .DOC.
Сведения о создании подобных сопоставлений из пакетных файлов приведены
в описаниях команд ASSOC и FTYPE.

При запуске 32-разрядного приложения с графическим интерфейсом пользователя
обработчик команд CMD.EXE не ожидает завершения работы приложения перед
возвратом к приглашению командной строки. Подобное новое поведение НЕ
относится к запуску приложений из пакетных файлов.

При выполнении командной строки, первым элементом которой является текстовая
строка «CMD» без расширения имени файла или указания пути, она заменяется
значением переменной COMSPEC. Это предотвращает запуск CMD.EXE из
текущей активной папки, если таковая программа там имеется.

Если первый элемент командной строки не содержит расширения имени файла,
обработчик команд CMD.EXE использует значение переменной среды PATHEXT,
чтобы определить расширения имен исполняемых файлов и порядок поиска
нужного файла. По умолчанию для переменной PATHEXT задается
значение:

Обратите внимание, что этот синтаксис подобен синтаксису для переменной
PATH, то есть отдельные элементы разделяются точкой с запятой.

Если при поиске исполняемого файла нет соответствия ни одному из расширений,
выполняется проверка соответствия указанного имени папки. Если имя папки
соответствует указанному, то команда START запускает EXPLORER для этого
пути. Если такое действие выполняется из командной строки, то оно
эквивалентно выполнению команды CD /D для указанного пути.

Оцените статью