2011-07-04 15:32:05 +0000 2011-07-04 15:32:05 +0000
56
56

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

Моя проблема в том, что в 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 и манипулированием его содержимым в этих местах:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(Элементы AutoRun - это _String values_…)

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

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

Ответы (11)

18
18
18
2011-07-04 17:45:20 +0000

Цитата Microsoft :

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

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

  • *

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

8
8
8
2013-03-21 14:10:13 +0000

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

1.Navigate to the folder where your executable situated 2.Shift-Right click and select “Command Window from here” 3.type in the name of the executable and hit enter 4.The process should run, but the window should stay open

4
4
4
2012-11-06 13:37:01 +0000

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

cmd.exe /k cmd /c ...

Чтобы использовать это по умолчанию для всех пакетных файлов, установите 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" %*.

3
3
3
2014-04-26 16:55:23 +0000

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

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

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

2
2
2
2015-12-11 17:02:56 +0000

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

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

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

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

2
2
2
2013-03-21 20:02:36 +0000
1
1
1
2013-03-12 15:30:15 +0000

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

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

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

start go.bat

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

1
1
1
2013-09-24 12:30:12 +0000

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

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

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

0
0
0
2017-03-30 08:30:11 +0000

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

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

read

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

0
0
0
2019-12-31 21:58:53 +0000

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

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

Файл: RunNodeJS.bat

@echo off
cd /d c:\
cmd.exe /k cmd /c node

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

Я использовал cmd.exe /k cmd /c node из-за другого ответа, приведенного здесь.

0
0
0
2017-06-30 03:30:27 +0000

В ответ на понижение рейтинга PSIXO - “Этот ответ уже был освещен в вопросе. - Ро Йо Ми Ян 20 ‘16 в 5:06” - Нет, не было. Предыдущие ответы были: “пауза”, которая НЕ сработала. Ответ PSIXO был: “и пауза”, которая НЕ сработала. Пожалуйста, разбирайте более тщательно перед понижением рейтинга. Я запустил его из IDLE-запроса, и он сработал:

>>> os.system('dir ^ & pause')
    0
    >>>

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

>>> os.system('dir ^ pause')
    1
    >>>

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

Похожие вопросы

3
19
10
28
3