Консольное приложение сразу закрывается windows

Обновлено: 07.07.2024

Теперь я просто попробовал Пример 1 (здесь - ссылка на MSDN ), и я столкнулся с проблемой: почему окно консоли сразу же закрывается после отображения моего вывода?

22 ответа

проблема в том, что их программа Hello World отображается, а затем немедленно закрывается.
это почему?

Потому что это завершено. Когда консольные приложения завершили выполнение и вернулись из своего метода main , соответствующее окно консоли автоматически закрывается. Это ожидаемое поведение.

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

Метод Console.ReadLine - это один из способов делая это. Добавление этой строки в конец вашего кода (непосредственно перед оператором return ) заставит приложение ждать, пока вы нажмете клавишу, перед выходом.

В качестве альтернативы вы можете запустить приложение без подключенного отладчика, нажав Ctrl + F5 из среды Visual Studio, но это имеет очевидный недостаток, который не позволяет вам использовать отладку. функции, которые вы, вероятно, захотите использовать при написании приложения.

Лучшим компромиссом, вероятно, является вызов метода Console.ReadLine только при отладке приложения путем включения его в директиву препроцессора. Что-то типа:

Вы также можете захотеть, чтобы окно оставалось открытым в случае возникновения неперехваченного исключения. Для этого вы можете поместить Console.ReadLine(); в блок finally :

По моему мнению, если мы хотим стабилизировать ВЫВОД КОНСОЛЬНОГО ПРИЛОЖЕНИЯ до закрытия вывода, отобразите USE, метку: после MainMethod и метку goto; до окончания программы

Если ваша программа требует, чтобы вы нажали Enter, чтобы продолжить, как если бы вам нужно было ввести значение и продолжить, добавьте новый тип double или int и введите write перед retunr (0); scanf_s ("% lf", & переменная);

Добавьте следующее перед возвращением 0:

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

Вы можете решить это очень простым способом, просто вызвав ввод. Однако, если вы нажмете Enter , консоль снова отключится. Просто используйте это Console.ReadLine(); или Console.Read();

Чтобы упростить то, что говорят другие: Используйте Console.ReadKey(); .

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

Источник: использую в своих программах для консольных приложений.

Я всегда добавляю следующий оператор в консольное приложение. (Создайте для этого фрагмент кода, если хотите)

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

Ctrl + F5 заставит консоль остаться, но вы не сможете отлаживать! Все консольные приложения, которые я написал в реальном мире, всегда не интерактивны и запускаются планировщиком, таким как TWS или CA Workstation, и не требуют чего-то подобного.

Инструменты -> Параметры -> Отладка -> Общие -> Автоматически закрывать консоль (5-я последняя опция)

Установите флажок и закройте

Это относилось ко всем проектам.

Что-либо, где бы то ни было в консольном приложении, никогда не используйте await , а вместо этого используйте theAsyncMethod().GetAwaiter().GetResult(); ,

Программа закрывается, как только завершится ее выполнение. В этом случае, когда вы return 0; . Это ожидаемая функциональность. Если вы хотите увидеть результат, либо запустите его в терминале вручную, либо установите ожидание в конце программы, чтобы оно оставалось открытым в течение нескольких секунд (с использованием библиотеки потоков).

Вот способ сделать это без участия Console :

Добавьте метод Read для отображения вывода.

Используйте Console.Read (); чтобы предотвратить закрытие программы, но убедитесь, что вы добавили код Console.Read(); перед оператором return, иначе это будет недостижимый код.

Код готов, чтобы продолжить, вам нужно добавить это:

Другой способ - использовать Debugger.Break() перед возвратом из метода Main

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

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

Если вы хотите, чтобы ваше приложение оставалось открытым, вам нужно что-то сделать, чтобы поддерживать его процесс. Приведенный ниже пример - самый простой, который можно поместить в конец вашей программы:

Однако это вызовет перегрузку процессора, так как он вынужден бесконечно повторяться.

На этом этапе вы можете выбрать использование класса System.Windows.Forms.Application (но для этого потребуется добавить ссылку System.Windows.Forms ):

Это не приводит к утечке ЦП и успешно работает.

Чтобы избежать добавления ссылки System.Windows.Forms , вы можете использовать простой трюк, так называемое ожидание вращения , импортировав System.Threading :

Это также отлично работает и в основном состоит из цикла while с отрицательным условием, которое возвращается указанным выше лямбда-методом. Почему это не перегружает процессор? Вы можете посмотреть исходный код здесь; в любом случае, он в основном ожидает некоторого цикла ЦП перед повторением.

Затем вы можете безопасно выполнить цикл, выполнив что-то вроде этого:

Программа немедленно закрывается, потому что ничто не мешает ей закрыться. Вставьте точку останова в return 0; или добавьте Console.Read(); перед return 0; , чтобы программа не закрывалась.

То же самое для Ctrl F5 или F5 . Поместите непосредственно перед концом метода Main .

Я предполагаю, что причина, по которой вы не хотите, чтобы он закрывался в режиме отладки, заключается в том, что вы хотите посмотреть значения переменных и т. Д. Так что, вероятно, лучше просто вставить точку останова на закрытии ">" основной функции . Если вам не нужно отлаживать, тогда Ctrl-F5 - лучший вариант.

Вместо того, чтобы использовать

Вы можете запустить свою программу, используя Ctrl + F5 (если вы находитесь в Visual Studio). Тогда Visual Studio будет держать окно консоли открытым, пока вы не нажмете клавишу.

Командная строка, будучи запущенной, закроется только тогда, когда пользователь нажмет кнопку завершения работы или выполнит в ней команду exit. Но бывает и такое, что после командная строка закрывается сама, не сообщая пользователю о результатах отработанного сценария и не сообщая о причинах закрытия. Как правило, с таким поведением консоли приходится сталкиваться при выполнении скриптов — CMD или BAT -файлов.

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

Ну что же, понудить ее изменить свое поведения очень просто. Самый простой способ — это добавить в конец командного файла команду pause или специальный ключ, запускающую копию командной строки.

Команда pause

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

Отройте скрипт Блокнотом или любым другим текстовым редактором и добавьте в самый конец кода команду pause или cmd /k.

Команда cmd /k

Это два разных способа и работают они по-разному.

CMD

Команда cmd /k работает несколько иначе.

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

Cmd /k

Если же добавить cmd /k в середину кода, его выполнение будет прервано и прекращено.

В этом основная разница между этими командами.

Тонкая настройка командной строки

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

Для этого открываем командой regedit редактор реестра и разворачиваем ветку:

HKCR\batfile\shell\open\command

В правой колонке меняем значение параметра по умолчанию с "%1" %* на cmd.exe /k "%1" %*.

RegEdit

Тоже самое проделываем с параметром по умолчанию в ветке HKCR\cmdfile\shell\open\command , для командных файлов формата CMD .

RegEdit

Вот и всё, отныне командная строка будет закрываться только по решению юзера, если только в сценарий не прописана команда exit .

Моя проблема в том, что в 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).

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

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

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

Используя 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, если у вас есть доступ к скрипту, вам нужно добавить следующий код в конце:

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

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

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

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

Это, вероятно, вопрос о запуске, поскольку, несомненно, ответ ослепительно очевиден.

Я использовал Visual Studio в течение многих лет, но это первый раз, когда я создал любую консольную программу.

Когда я запускаю приложение, появляется окно консоли, появляется выход программы, а затем окно закрывается по мере выхода приложения.

Есть ли способ открыть его, пока я не проверил вывод или не просмотрел результаты после закрытия окна?

ОТВЕТЫ

Ответ 1

Если вы запускаете без отладки (Ctrl + F5), то по умолчанию он предлагает вам нажать return, чтобы закрыть окно. Если вы хотите использовать отладчик, вы должны поставить точку останова в последней строке.

Ответ 2

Щелкните правой кнопкой мыши на вашем проекте

Свойства> Свойства конфигурации> Линкер> Система

Выберите Console (/SUBSYSTEM: CONSOLE) в опции SubSystem или вы можете просто ввести Console в текстовое поле!

Теперь попробуйте. это должно работать

Ответ 3

Вот способ для C/С++:

Ответ 4

Откройте меню отладки- > Нажмите Начать без использования

Ответ 5

Он будет ждать <ENTER> .

Ответ 6

попробуйте вызвать getchar() прямо перед возвратом main() .

Ответ 7

(/SUBSYSTEM: CONSOLE) не работал для моего vs2013 (у меня его уже было).

"run without debugging" не является параметром, так как я не хочу переключаться между отладкой и просмотром вывода.

Решение, используемое в qtcreator до 2.6. Теперь, когда qt растет, vs идет другим путем. Насколько я помню, в vs2008 нам не нужны такие трюки.

Ответ 8

Здесь решение, что (1) не требует каких-либо изменений кода или точек останова, и (2) приостанавливается после завершения программы, чтобы вы могли видеть все, что было напечатано. Он остановится после F5 или Ctrl + F5. Основной недостаток заключается в том, что на VS2013 Express (как проверено) он не загружает символы, поэтому отладка очень ограничена.

Создайте командный файл. Я назвал мой runthenpause.bat со следующим содержимым:

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

Откройте свойства проекта | Конфигурационные свойства | Отладка.

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

Я опубликую обновление, если выясню, как загрузить символы. Я пробовал /Z7 за этот, но безуспешно.

Ответ 9

просто введите свою последнюю строку кода:

Ответ 10

Начиная с Visual Studio 2017 (15.9.4) есть опция:

Автоматически закрывать консоль, когда отладка прекращается:

Сообщает Visual Studio закрыть консоль в конце сеанса отладки.

Ответ 11

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

и таким образом окно не будет закрываться, пока вы не введете данные для переменной a .

Ответ 12

добавить "| pause" в поле аргументов команды в разделе отладки в свойствах проекта.

Ответ 13

Просто нажмите CNTRL + F5, чтобы открыть его во внешнем окне командной строки (Visual Studio не контролирует его).

Если это не сработает, добавьте следующее в конец вашего кода:

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

Если вы хотите сделать это в нескольких местах, поместите вышеуказанный код в метод (например, private void Pause() ) и вызовите Pause() всякий раз, когда программа достигает возможного конца.

Ответ 14

Несколько лучшее решение:

в начале вашей программы.

  • может использовать std:: exit()
  • может иметь несколько возвратов из основного
  • вы можете запустить свою программу под отладчиком
  • Независимый IDE (+ независимый от ОС, если вы используете трюк cin.sync(); cin.ignore(); вместо system("pause"); )
  • необходимо изменить код
  • не будет останавливаться на std:: terminate()
  • все равно произойдет в вашей программе вне сеанса IDE/debugger; вы можете предотвратить это под Windows, используя:

Ответ 15

Обязательно сделайте любой из них в конце функции main() и перед оператором return .

Ответ 16

В моем случае я испытал это, когда создал проект Empty C++ в версии VS 2017 для сообщества. Вам нужно будет установить для подсистемы значение "Консоль (/SUBSYSTEM: CONSOLE)" в разделе "Свойства конфигурации".

  1. Зайдите в "Просмотр", затем выберите "Менеджер недвижимости"
  2. Щелкните правой кнопкой мыши на проекте/решении и выберите "Свойство". Откроется страница свойств теста.
  3. Перейдите к компоновщику, затем выберите "Система"
  4. Нажмите "Подсистема" и появится выпадающий
  5. Выберите "Консоль (/SUBSYSTEM: CONSOLE)"
  6. Применить и сохранить
  7. В следующий раз, когда вы запустите свой код с помощью "CTRL +F5", вы должны увидеть результат.

Ответ 17

Вы также можете использовать эту опцию

Ответ 18

Ответ 19

Visual Studio 2015, импорт. Потому что я ненавижу когда примеры кода не дают необходимых импортов.

Читайте также: