Моя проблема в том, что в Windows есть окна командной строки, которые закрываются сразу после выполнения. Чтобы решить эту проблему, я хочу, чтобы по умолчанию было открыто окно. Обычно такого поведения можно избежать тремя способами, которые приходят мне в голову:
- Поставить
pause
строку после пакетных программ, чтобы предложить пользователю нажать клавишу перед выходом - Запуск этих командных файлов или других инструментов для работы с командной строкой (даже запуск службы, перезапуск и т. Д. С помощью
net start xy
чего-либо подобного) вcmd.exe
(Пуск - Выполнить - cmd.exe) - Запуск этих программ с помощью
cmd /k
этого:cmd /k myprogram.bat
Но есть и другие случаи, когда пользователь:
- Запускает программу в первый раз и не знает, что данная программа будет запускаться в командной строке (Windows Command Processor), например, при запуске ярлыка из меню «Пуск» (или из другого места), ИЛИ
- Несколько неудобно постоянно запускать cmd.exe, и у него нет времени / возможности везде переписывать код этих команд, чтобы ставить после них паузу или избегать явного выхода.
Я прочитал статью об изменении поведения по умолчанию cmd.exe
при его явном открытии с созданием записи автозапуска и манипулированием ее содержимым в следующих местах:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun
(Элементы автозапуска _String values_
...)
Я положил cmd /d /k
в качестве значения, чтобы он попробовал, но это совсем не изменило поведение упомянутых выше вещей ... Он просто изменил поведение окна командной строки при его явном открытии (Start-Run- cmd.exe).
Итак, как это работает? Можете ли вы дать мне какие-либо идеи для решения этой проблемы?
источник
stdout
на постоянной основе, которые никогда не были видны по уважительной причине.Ответы:
У меня есть решение , которое может применяться только
.cmd
и.bat
файлы:Откройте
regedit
и перейдите к каждому из:Теперь измените «Значение ключа по умолчанию» на
cmd.exe /k "%1" %*
. Теперь каждое окно пакетного скрипта останется открытым после его выполнения.Обратите внимание, что это похоже на использование
cmd.exe /c cmd.exe /k program.bat
, что означает, что другой экземпляр CMD будет запущен в родительский. Я не мог найти, как переписать первый/c
аргумент.Вы также можете сделать это с помощью
[exefile]
, но теперь он покажет пустое поле консоли, если исполняемый файл имеет графический интерфейс.источник
*
. Пожалуйста, будьте осторожнее при редактировании!Цитата Microsoft :
Другими словами, консольное окно Win32 всегда будет закрыто при выходе из последней программы, работающей внутри него, и вы не можете это изменить.
(Для 16-разрядных программ MS-DOS Windows предлагает параметр «Закрыть при выходе» в диалоговом окне свойств, но это не исключение из описанного выше поведения: это процесс NTVDM, который держит окно открытым. Также эта опция снова за программу.)
источник
How can I do X
, нетIn your opinion, should I do X
. Этот ответ бесполезен, он подразумевает, что X невозможно, когда частичные решения уже были представлены в другом месте. (-1)Просто откройте командную строку в месте вашего пакетного файла и вручную введите имя своего пакетного файла, чтобы запустить его в этом окне.
1. Перейдите в папку, в которой находится ваш исполняемый файл.
2. Щелкните правой кнопкой мыши Shift и выберите «Окно командной
строки ». 3. Введите имя исполняемого файла и нажмите 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" %*
.источник
"%*"
передает полный список параметров, поэтому не будет ли это передать первый параметр дважды, один раз"%1"
и снова, как первый параметр"%*"
?%1 %2 %3 ..
и%*
которую я не помню сейчас , кроме%1 %2 %3
работ , в некоторых случаях , когда%*
не удается.Я только что наткнулся на глупое решение после прочтения
grawity
ответа.Моим примером использования была настройка консольной среды на работе, где все более разумные решения блокируются. Все, что мне нужно, это установить PATH, настроить псевдонимы doskey и сбросить их в оболочку.
Мое решение (только что протестированное на Win7) так же добавляется
cmd
как последняя строка в командном файле. Это запускает вложенную командную строку, которая наследует среду своего родителя. Эта дочерняя оболочка удерживает пакетный процесс открытым до тех пор, пока вы не ВЫХОДИТЕ, после чего пакет не имеет дочерних процессов и также завершается.источник
Вместо использования PAUSE (я предпочитаю, чтобы CHOICE или TIMEOUT использовали PAUSE, когда это необходимо), вы можете использовать решение здесь: 886848 / how-to-make-windows-batch-file-pause-when-double-click .
Таким образом, если вы щелкнете по пакетному файлу или по ссылке (ярлыку) из проводника 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 в 5:06» - НЕТ, это было НЕ. Предыдущие ответы были: «пауза», которая НЕ работала. PSIXO ответил: «& пауза», которая работает. Пожалуйста, проанализируйте более внимательно, прежде чем понизить. Я запустил это из приглашения IDLE, и это сработало:
С другой стороны:
НЕ работало (приглашение cmd перевернулось и фактически вернуло ошибку (1)). Спасибо PSIXO за ответ, который мне был нужен. Генри.
источник