cmd-разница между выходом и выходом
Если вы печатаете telnet
в cmd вам нужно будет набрать quit
чтобы выбраться оттуда, но если вы введете wmic
, и то и другое quit
а также exit
буду работать.
Welcome to Microsoft Telnet Client
Escape Character is 'CTRL+]'
Microsoft Telnet> exit
Invalid Command. type ?/help for help
Microsoft Telnet> quit
C:\windows\system32>
C:\windows\system32>wmic
wmic:root\cli>quit
C:\windows\system32>
C:\windows\system32>wmic
wmic:root\cli>exit
C:\windows\system32>
Также, Ctrl+C
должен прервать запущенный процесс или завершить пакетное задание, но Ctrl+C
также выйдет из wmic
но нет telnet
,
Зачем нужна вся эта путаница? Почему не может быть только один стандарт?
3 ответа
Причина этого заключается в том, что приложения являются отдельными. Telnet запускает программу telnet.exe в вашем терминале, и все, что вы вводите, происходит в telnet.exe, а НЕ в cmd.exe (ваша командная строка). Ваша командная строка просто стала интерфейсом, с помощью которого вы отправляете команды telnet в telnet.
wmic.exe - это отдельная программа с собственным набором команд, которая может иметь команду выхода, отличную от других программ. Вы можете просмотреть список команд для каждой программы, запущенной в командной строке, и есть некоторые стандарты, но они не "по необходимости".
Если бы вы запускали сеанс python внутри командной строки, ваши ctrl+c прервали бы действие python, но exit() была бы командой, которую нужно запустить для выхода.
Дайте мне знать, если вам нужно больше объяснений, чем это, в основном просто каждая программа (telnet.exe, nslookup.exe, wmic.exe) имеет свой уникальный набор команд, и они не всегда стандартизированы, потому что разные разработчик или команды или изменения со временем были связаны с каждой программой.
Как отмечалось в комментарии выше, telnet также является более старой стандартизированной службой, используемой многими поставщиками, тогда как wmic - это продукт, разработанный Microsoft, это еще одна вещь, которую следует учитывать при рассмотрении стандартизированных команд - например, было бы более вероятно, что Microsoft разработала инструменты (wmic и т. д.) имеют стандартизированные команды, в то время как кроссплатформенные инструменты (telnet, ssh и т. д.) ведут себя одинаково на разных платформах (Mac, *nix, Windows), но не в соответствии с разработанными Apple или Microsoft общими / лучшими практиками.
Все quit
, q
выход из telnet
ракушка.
И то и другое exit
а также quit
выход из wmic
ракушка.
exit
выход из cmd.exe
это командная строка Windows.
Таким образом, это зависит от того, где вы находитесь и из чего вы выходите, так как оболочки [например, интерактивные программы, принимающие команды], имеют свои собственные команды.
Вот документы из Windows SDK. Что касается " Почему", то программы могут адаптировать свою работу. Ctrl + C также является символьным кодом 3, который является управляющим кодом etx - конец текста. Также помните CMD
это обычная консольная программа, вроде wmic
или же ftp
,
Консольные контроллеры
Каждый консольный процесс имеет свой собственный список функций-обработчиков управления, которые вызываются системой, когда процесс получает сигнал CTRL+C, CTRL+BREAK или CTRL+CLOSE. Изначально список обработчиков элементов управления для каждого процесса содержит только функцию-обработчик по умолчанию, которая вызывает функцию ExitProcess. Консольный процесс может добавлять или удалять дополнительные функции HandlerRoutine, вызывая функцию SetConsoleCtrlHandler. Эта функция не влияет на списки обработчиков управления для других процессов. Когда консольный процесс получает какой-либо из управляющих сигналов, он вызывает функции-обработчики на основе последней зарегистрированной, вызываемой в первую очередь, пока один из обработчиков не вернет TRUE. Если ни один из обработчиков не возвращает TRUE, вызывается обработчик по умолчанию.
Параметр dwCtrlType функции определяет, какой управляющий сигнал был получен, а возвращаемое значение указывает, был ли обработан сигнал.
Пример функции обработчика управления см. В разделе "Регистрация функции обработчика управления".
Сигналы CTRL + C и CTRL + BREAK
Комбинации клавиш CTRL + C и CTRL + BREAK получают особую обработку консольными процессами. По умолчанию, когда окно консоли имеет фокус клавиатуры, CTRL+C или CTRL + BREAK обрабатываются как сигнал (SIGINT или SIGBREAK), а не как ввод с клавиатуры. По умолчанию эти сигналы передаются всем процессам консоли, которые подключены к консоли. (Отдельные процессы не затрагиваются.) Система создает новый поток в каждом клиентском процессе для обработки события. Поток вызывает исключение, если процесс отлаживается. Отладчик может обработать исключение или продолжить обработку без обработки.
CTRL + BREAK всегда обрабатывается как сигнал, но приложение может изменить поведение CTRL + C по умолчанию двумя способами, предотвращающими вызов функций-обработчиков:
Функция SetConsoleMode может отключить режим ввода ENABLE_PROCESSED_INPUT для буфера ввода консоли, поэтому CTRL + C сообщается как ввод с клавиатуры, а не как сигнал.
Когда SetConsoleCtrlHandler вызывается со значениями NULL и TRUE для его параметров, вызывающий процесс игнорирует сигналы CTRL + C. Обычная обработка CTRL + C восстанавливается путем вызова SetConsoleCtrlHandler со значениями NULL и FALSE. Этот атрибут игнорирования или не игнорирования сигналов CTRL + C наследуется дочерними процессами, но он может быть включен или отключен любым процессом, не затрагивая существующие процессы.
CTRL + ЗАКРЫТЬ сигнал
Система генерирует сигнал CTRL+CLOSE, когда пользователь закрывает консоль. Все процессы, подключенные к консоли, получают сигнал, давая возможность каждому процессу очиститься перед завершением. Когда процесс получает этот сигнал, функция-обработчик может выполнить одно из следующих действий после выполнения любых операций очистки:
Вызовите ExitProcess, чтобы завершить процесс.
Вернуть ЛОЖЬ. Если ни одна из зарегистрированных функций-обработчиков не возвращает TRUE, обработчик по умолчанию завершает процесс.
Вернуть ИСТИНА. В этом случае никакие другие функции-обработчики не вызываются, и всплывающее диалоговое окно спрашивает пользователя, следует ли завершить процесс. Если пользователь решает не завершать процесс, система не закрывает консоль, пока процесс не завершится окончательно.
Отправить комментарии по этой теме в Microsoft
Дата постройки: 02.10.2006