pasta/cli.md at master · codedokode/pasta · GitHub

Что делать, если не загружается windows

📌Вариант 1: воспользоваться другим рабочим компьютером и записать установочную флешку с Windows. Также не помешает и LiveCD-флешка (эта “штуковина” позволит загружать “полноценную” Windows с флешки, и, само собой, работать с командной строкой… Для восстановления загрузчика Windows — обратите внимание на эту табличку).

📌Вариант 2: воспользоваться телефоном (под Android) и записать на нем установочную флешку. Далее подключить ее к ПК, и загрузиться…

📌Кстати, открыть окно командной строки можно и с установочной флешки с Windows: достаточно загрузиться с нее и нажать сочетание Shift F10. Далее можно выполнить многое из таблиц выше…

📌 Рекомендую! Коллекция аварийных флешек, которую нужно иметь на экстренный случай (как раз, когда не загружается Windows).

На сим пока всё, дополнения приветствуются!

Успехов!

Скромное начало: ms-dos

На заре компьютерной индустрии управление большинством компьютеров осуществлялось путём ввода команд в командной строке. За рыночную долю боролись компьютеры под Unix, CP/M, DR-DOS и других. В итоге система MS-DOS стала стандартом де-факто для IBM PC и всех совместимых компьютеров:

pasta/cli.md at master · codedokode/pasta · GitHub
MS-DOS 6.0

Как и большинство основных операционных систем того времени, интерпретатор командной строки или «оболочка» в MS-DOS предоставляла простой, но относительно эффективный набор команд и синтаксис командных скриптов для написания batch-файлов (.bat).

Предприятия крупного и малого бизнеса очень быстро взяли на вооружение MS-DOS и в совокупности создали многие миллионы скриптов, некоторые из которых всё ещё используются сегодня! Batch-скрипты применяются для автоматизации настройки ПК, установки/изменения параметров безопасности, обновления программного обеспечения, сборки кода и т.д.

Вы редко или никогда не увидите реальную работу такого скрипта, потому что многие из них выполняются в фоновом режиме, например, при авторизации на компьютере. Но сотни миллиардов скриптов командной строки и команд выполняются каждый день только на Windows!

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

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

Так что внутри консоли windows?


До Windows 7 инстансы консоли Windows размещались в критически важной подсистеме

! Но в Windows 7 из соображений безопасности и надёжности консоль переместили из CSRSS в следующие бинарники:

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

Ядро консоли состоит из следующих компонентов (снизу вверх):

  • ConDrv.sys — драйвер режима ядра
  • ConHost.exe — приложение Win32 GUI:
    • ConHost Core — внутренности и механика
      • Сервер API: преобразует сообщения IOCTL, полученные из приложений командной строки, в вызовы API и отправляет текстовые записи из консоли в приложение командной строки
      • API: реализует консольный API Win32 и логику для всех операций, которые консоль может попросить выполнить
      • Буфер ввода: хранит записи событий клавиатуры и мыши, генерируемые пользовательским вводом
      • VT Parser: если включен, анализирует последовательности VT, извлекает их из текста и генерирует эквивалентные вызовы API
      • Буфер вывода: хранит текст, отображаемый на дисплее консоли. По сути, это 2D-массив структур CHAR_INFO, которые содержат символьные данные и атрибуты каждой ячейки (подробнее о буфере ниже)
      • Другое: в схему не включены инфраструктура сохранения/извлечения значений из реестра и/или файлов ярлыков и т.д.
    • Console UX App Services — слой UX и UI

Базовые консольные команды. что к чему и почему. вводная

Собственно, эта штука является одним из ключевых элементов по управлению системой не смотря на то, что ОС давно уже перешли на графический интерфейс. Не знать о консоли и не уметь владеть хотя бы базовыми её основами – это плохо, а уж будучи IT-шником не иметь знаний об элементарных вещах так вообще..

Чтобы запустить командную строку, нажмите  сочетание клавиш Win R и в появившемся окне «Выполнить» введите cmd. Сама утилита командной строки лежит обычно в папке C:WindowsSystem32cmd.exe.

Вот так по умолчанию выглядит командная строка Windows. Как видите, все достаточно аскетично. Если захочется более симпатичного вида, щелкните правой кнопкой мыши по заголовку окна  и выберите пункт «Свойства», вкладка «Цвета», на которой вы можете выбрать цвет шрифта и фона.

команды консоли (cmd) windows - скриншот 2
В открывшемся окне сверху вы видите традиционный знак копирайта мелкомягких, а чуть ниже строка с текущим каталогом и мигающий курсор, приглашающий начать работу.

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

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

Команда dirОтображает содержимое текущего каталога. Если же вам необходимо просмотреть содержимое другого каталога, придется указать консоли путь, например: dir (пробел) C:, и нажать Enter.

Команда cdПозволяет менять текущий каталог. Напомню, что каталог, в котором Вы в данный момент находитесь, указан здесь:

Чтобы сменить текущий каталог наберите: cd (пробел) C:Имя папки и нажмите Enter.

Примечания:

Команда mkdirПозволяет создавать новые папки с тем название, которое вы зададите.

По умолчанию команда mkdir создает папки в текущем каталоге. Если же нужно создать папку в другом каталоге, пропишите это, например:

С помощью этой же команды можно создать сразу древо каталогов.

Команда rmdirСлужит для удаления каталогов. Примерно вот так:

Примечание: по умолчанию команда rmdir удаляет только пустые каталоги. Если с ее помощью Вы попробуете удалить папку с содержимым, то увидите такое сообщение:

Чтобы удалить непустую папку, к команде rmdir нужно добавить параметр /S. Вот так:

Не забудьте подтвердить удаление, нажав на клавиши «Y» и Enter.

Команда shutdownДумаю, что из названия понятно, что эта команда позволяет выключать компьютер. Предвижу вполне закономерный вопрос – а зачем выключать компьютер с помощью командной строки, когда гораздо проще выключить его через главное меню Windows.

Итак, наберите в командной строке:

shutdown (пробел) –s

В этом случае компьютер просто выключится. Если же вам нужно отложенное выключение компьютера, наберите:

shutdown (пробел) –s (пробел) –t  (пробел)время в секундах, через которое должен выключиться компьютер:

Как только вы нажмете Enter, начнется обратный отсчет времени, которое осталось до выключения компьютера. В XP это выглядит так:

В Windows 7:

Если же вы передумали выключать компьютер, остановить обратный отсчет можно, добавив параметр –a к команде shutdown. Вот так:

И обратный отчет будет отключен.

Команда systeminfoВыдает подробную информацию о конфигурации системы, сведения о версии, типе, процессоре, версии BIOS, объеме памяти и т.д. Вот так:

Команда driverqueryВыводит список всех установленных драйверов устройств и их свойства. Если добавить к команде параметр /V, помимо списка драйверов будет выведен и их статус.

Команда cls

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

Команда msconfigВызывает службу “Конфигурация системы Windows”.

Думаю, что для многих она будет не нова.

Команда ipconfigЕсли набрать команду без дополнительных параметров, то будут выведены сведения об IP-адресе, маске подсети и основном шлюзе для каждого сетевого адаптера. Подробней об этом всём написано в статье “Терминология компьютерной сети или что есть что [IP, TCP, UDP, ICMP, MAC и пр.]”

Команда regeditОткрывает утилиту, с помощью которой можно редактировать системный реестр Windows.

Думаю, что тоже знакома многим.

Команда chkdskПредназначается для запуска проверки логических дисков на наличие ошибок. Если команда используется без дополнительных параметров, то на экран выводится отчет о состоянии текущего диска.

Вот некоторые параметры команды, которые могут пригодиться при проверке дисков:

Команда formatС помощью этой команды можно отформатировать жесткий диск. Сейчас выполнять не рекомендую 🙂 Синтаксис:

format (пробел) С: Enter.

Для этой команды существуют следующие дополнительные параметры:

Это так, суровый минимум 🙂

Команда pathpingУтилита, которая запускается этой командой, предоставляет информацию о потере данных на промежуточных узлах между начальным и конечным пунктом. Команда в течение определенного времени отправляет сообщения с эхо-запросом каждому маршрутизатору, находящемуся на пути, а затем на основании полученных ответов вычисляет коэффициент потери для каждого маршрутизатора. Таким образом можно определить маршрутизаторы, имеющие проблемы доступа к сети.

Команда netstat  Отображает активные подключения TCP, порты, прослушиваемые компьютером, статистику Ethernet, таблицы маршрутизации IP, статистику IPv4 (для протоколов IP, ICMP, TCP и UDP) и IPv6 (для протоколов IPv6, ICMPv6, TCP через IPv6 и UDP через IPv6). Если запустить команду без параметров, то отобразятся только подключения TCP.

Команда tasklistЗапускает утилиту командной строки, которая выводит список всех запущенных системой процессов с PID-кодом и размером занимаемой оперативной памяти. Если команду запустить без дополнительных параметров, выводится список процессов текущего компьютера.

Для того, чтобы увидеть список процессов удаленного компьютера служит параметр /s  с указанием IP-адреса или доменного имени компьютера.

Команда taskkillВ противоположность предыдущей команде, эта предназначается для остановки процесса в локальной или удаленной системе. Процесс можно остановить по его идентификатору. Для этого используйте параметр /pid. Например, вот так:

taskkill (пробел) /pid (пробел) 3148 Enter

Кроме этого, процесс можно остановить по имени образа с помощью добавления параметра /im. Вот так:

taskkill (пробел) /im (пробел) AnVir.exe EnterДалее.

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

Ну и.. Так далее 🙂 А это самое “так далее” Вы увидите в новых статьях!

Microsoft ibm == os/2… ненадолго


В 1985 году Microsoft начала работать с IBM над новой операционной системой

. Она изначально планировалась как «более функциональная DOS» для некоторых современных 32-битных CPU и с учётом других технологий, которые быстро порождались в IBM и у других OEM.

Но история OS/2 оказалась слишком бурной. В 1990 году Microsoft и IBM прекратили сотрудничество. Это было обусловлено рядом факторов, в том числе значительными культурными различиями между разработчиками IBM и Microsoft, проблемами планирования, а также взрывным успехом и ростом внедрения Windows 3.1. IBM продолжала разработку и поддержку OS/2 до конца 2006 года.

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

Windows console и vt

Как описано выше, консоль Windows предоставляет

. С помощью Console API приложения и инструменты командной строки пишут текст, изменяют его цвет, перемещают курсор и т.д. И благодаря этим API не нужно было поддерживать последовательности ANSI/VT, которые обеспечивают похожую функциональность на других платформах.

Фактически, до Windows 10 в консоли Windows была реализована только минимальная поддержка последовательностей ANSI/VT:

Всё изменилось в 2022 году, когда Microsoft сформировала новую группу разработки Windows Console. Одним из её главных приоритетов стало реализовать всестороннюю поддержку последовательностей ANSI/VT для визуализации выходных данных приложений *NIX, работающих в подсистеме Windows для Linux (WSL) и на удалённых машинах *NIX.

Группа быстро внедрила в консоль Windows 10 всестороннюю поддержку последовательностей ANSI/VT, что позволило пользователям использовать и наслаждаться огромным набором инструментов и приложений командной строки Windows и Linux.

:/>  Интерфейс командной строки

Команда продолжает улучшать поддержку VT с каждым выпуском ОС и будет благодарна за любые проблемы, которые вы упомянете в нашем трекере на GitHub. 😉

Большая ставка microsoft: windows nt


В 1988 году Microsoft пригласила

, создателя популярной и уважаемой операционной системы

в компании DEC. Его задача — создать новую, современную, независимую от платформы операционную систему, которой Microsoft будет владеть, контролировать и на которой во многом построит своё будущее.

Этой новой операционной системой стала Windows NT: фундамент, на котором построены Windows 2000, Windows XP, Windows Vista, Windows 7, Windows 8 и Windows 10, а также во все версии Windows Server, Windows Phone 7 , Xbox и HoloLens!

Windows NT изначально спроектирована как кроссплатформенная система. Сначала она поддерживала Intel i860, затем MIPS R3000, Intel 80386 , DEC Alpha и PowerPC. С тех пор семейство ОС Windows NT портировали для поддержки процессорных архитектур IA64 Itanium, x64 и ARM/ARM64, среди прочих.

Windows NT предоставляет интерфейс командной строки через терминальное приложение Windows Console и командную строку Command Prompt (cmd.exe). Cmd разработан на максимальную совместимость с пакетными скриптами MS-DOS, чтобы помочь бизнесу перейти на новую платформу.

В *nix всё является файлом

Когда Unix впервые появился в конце 1960-х и начале 1970-х годов, одним из основных принципов стало то, что (где это возможно) всё следует абстрагировать как файловый поток. Одна из ключевых целей заключалась в упрощении кода для доступа к устройствам и периферии: если все устройства представляются в ОС как файлы, то коду легче получить к ним доступ.

Эта философия работает на самом глубоком уровне: можно даже перемещаться и опрашивать большую часть конфигурации ОС и компьютера под *NIX, перемещаясь по псевдо/виртуальным файловым системам, которые показывают то, что кажется «файлами» и папками, но на самом деле представляет собой конфигурацию машины и оборудование.

Например, в Linux можно исследовать свойства процессоров, изучая содержимое псевдофайла /proc/cpuinfo:

Но простота и согласованность этой модели могут дорого стоить: извлечение/анализ конкретной информации в псевдофайлах часто требует специальных инструментов, таких как sed, awk, perl, python и т.д. Эти инструменты используются для написания команд и скриптов парсинга текстового содержимого, поиска определённых шаблонов, полей и значений.

В windows всё является объектом

Когда проектировалась

, «объекты» рассматривались как будущее в разработке программного обеспечения: «объектно-ориентированные» языки программирования появлялись быстрее, чем тараканы: Simula и Smalltalk уже зарекомендовали себя, а C набирал популярность. За ними последовали другие

, в том числе Python, Eiffel, Objective-C, ObjectPascal/Delphi, Java, C# и многие другие.

Результат предсказуем. Созданная в те пьянящие, объектно-ориентированные дни (около 1989 года) Windows NT разработана с философией, что «всё является объектом». На самом деле одной из самых важных частей ядра NT является Менеджер объектов!

Windows NT предоставляет богатый набор Win32 API для получения и/или управления объектами ОС. Разработчики используют Win32 API для сбора и представления информации, похожей на данные из псевдофайлов и инструментов *NIX, только через объекты и структуры.

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

Итак, возвращаясь к основной дискуссии о консоли Windows: команда NT решила построить «консоль», отличную от традиционного терминала *NIX в нескольких ключевых областях:

Графический интерфейс идёт в мейнстрим


Добро пожаловать в

, изобретённый в

Вскоре после изобретения появилось много конкурирующих GUI на компьютерах Lisa и Macintosh от Apple, Commodore Amiga (Workbench), Atari ST (DRI GEM), Acorn Archimedes (Arthur/RISC OS), Sun Workstation, X11/X Windows и многих других, в том числе Microsoft Windows.

Windows 1.0 вышла в 1985 году и являлась по сути приложением MS-DOS, которое предоставляло простое окружение GUI с плиточным окном, позволяя пользователям запускать несколько приложений бок о бок:

pasta/cli.md at master · codedokode/pasta · GitHub
Windows 1.01 на MS-DOS

Windows 2.x, 3.x, 95 и 98 работали на базе MS-DOS. Более поздние версии Windows начали заменять некоторые функции MS-DOS альтернативами Windows (например, операции с файловой системой), но все они полагались на фундамент MS-DOS.

Примечание: Windows ME (Millennium Edition) стала интересным гибридом. В ней наконец-то заменили поддержку MS-DOS и поддержку реального режима из предыдущих версий Windows несколькими новыми функциями (особенно технологии Gaming & Media). Некоторые функции позаимствованы из Windows 2000 (например, новый стек TCP/IP), но настроены для работы на домашних ПК, которым трудно запустить полноценную NT.

Но Microsoft понимала, что не может бесконечно растягивать архитектуру и возможности MS-DOS и Windows. Требовалась новая операционная система с прицелом на будущее.

Давным-давно в далёкой-далёкой серверной…


С первых дней развития информатики людям нужен был эффективный способ передавать компьютеру команды и данные и видеть результат выполнения этих команд/вычислений.

Одним из первых по-настоящему эффективных человеко-машинных интерфейсов стал Tele-Typewriter или «телетайп». Это электромеханическая машина с клавиатурой для ввода данных и каким-нибудь устройством вывода — сначала использовался принтер, позже экран.

Вводимые оператором символы локально буферизуются и отправляются с телетайпа на соседний компьютер или мейнфрейм в виде серии сигналов по электрическому кабелю (например, RS-232) со скоростью 10 символов в секунду (110 бод, бит в секунду, bps):

pasta/cli.md at master · codedokode/pasta · GitHub
Телетайп Model 33 ASRПримечание: Дэвид Гессвейн ведёт отличный сайт по PDP-8, где можно найти больше информации об ASR33 (и соответствующей технологии PDP-8), в том числе фотографии, видео и др.

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

Затем технология улучшилась, скорость передачи выросла до 19200 bps, а шумные и дорогие принтеры заменили ЭЛТ-дисплеями (широко распространённый тип дисплеев в 80-е и 90-е годы), как на популярном терминале DEC VT100:

pasta/cli.md at master · codedokode/pasta · GitHub
Терминал DEC VT100

Хотя технология улучшилась, но эта модель — терминал отправляет символы программе на компьютере, а он выдаёт текст для пользователя — осталась и сегодня как фундаментальная модель взаимодействия всех командных строк и консолей на всех платформах!

pasta/cli.md at master · codedokode/pasta · GitHub
Архитектура терминала и командной строки

Модель по-своему элегантна. Одна из причин — в сохранении простоты и цельности каждого компонента: клавиатура выдаёт символы которые буферизуются как электрические сигналы. Устройство вывода просто выдаёт на дисплей (бумагу/экран) символы, полученные с компьютера.

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

Для загрузки и восстановления windows

📌 Примечание: если у вас не загружается Windows — командную строку можно вызвать с установочной флешки.

Команда (скопировать в окно CMD и нажать Enter)Описание команды / результат ее выполнения
1chkdsk /x/f/r

можно и так:

chkdsk D: /f

Проверка текущего сист. диска на ошибки (/ либо проверка указанного диска).
2sfc /scannowПроверка целостности системных файлов.
3BCDEDITДиспетчер загрузки Windows
4

Затем, узнав том с Windows, использовать:

bcdboot d:windows

Сначала узнаем том, на котором установлена Windows, затем восстанавливаем файлы загрузки.
5

Затем ввести:

bcdboot D:windows /s Z: /f UEFI

Сначала узнаем все тома дисков в системе.

Далее выбираем “ESP” том, он в 99-512 МБ (FAT32) (важно: вместо “2” нужно будет выбрать свой том). Затем присваиваем ему букву Z.

Далее указываем букву тома с Windows (вначале мы узнали и ее тоже) и восстанавливаем файлы загрузки.

6rstruiЗапуск утилиты для отката системы (если есть точки восстановления).
7sysdm.cplСоздать точку восстановления ОС в окне “Защита системы”.
8wmic.exe /Namespace:\rootdefault Path SystemRestore Call CreateRestorePoint “MyRestorePoint”, 100, 7Создать точку восстановления системы в авто-режиме (без лишних вопросов).
9bcdedit /set {default} safeboot minimal

или

bcdedit /set {default} safeboot network

Загрузка безопасного режима (можно вводить, загрузившись с установочной флешки). Полезная команда, если в обычном режиме Windows не загружается (“лагает”).

–//–

C поддержкой сети.

*

Важно: чтобы отменить загрузку в безопасном режиме — в рабочей Windows используйте команду: bcdedit /deletevalue {default} safeboot 

10msconfigКонфигурация системы (здесь можно настроить запуск служб, автозагрузку ПО, режим загрузки ОС).
11dism /online /export-driver /destination:F:MyDrivers

Dism /online /Add-Driver /Driver:F:MyDrivers /Recurse

Первая команда создает копию драйверов, вторая – восстанавливает их из копии. Работает в Windows 10/11 (Net Framework 3.5).

Для просмотра характеристик устройства, сведений о системе

👉 Также в помощь!

1) Программы для проверки имониторинга температуры процессора, видеокарты, диска

2) Как узнать характеристики компьютера, ноутбука

Команда (скопировать в окно CMD и нажать Enter)Описание команды / результат ее выполнения
1systeminfoПокажет информацию о системе: версию ОС Windows, модель компьютера (ноутбука), владельца, версию BIOS, кол-во ОЗУ, домен (рабочую группу), имя ПК, сетевые адаптеры и пр.
2wmic cpu get nameУзнать модель ЦП (примерный ответ: “AMD Ryzen 3 5300U with Radeon Graphics.”). Др. способы.
3wmic bios get serialnumberСерийный номер устройства (ноутбука, например).
4wmic baseboard get product

wmic baseboard get version

Модель мат. платы / ее версия.
5wmic bios get SMBIOSBIOSVersionВерсия BIOS.
6wmic path win32_VideoController get nameНазвание видеокарты (др. способы).
7wmic path win32_VideoController get VideoModeDescriptionРазрешение экрана, цвета.
8wmic OS get Caption,OSArchitecture,VersionИнформация о Windows.
9wmic DISKDRIVE get CaptionИнформация о накопителях.
10wmic /namespace:\rootwmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperatureПосмотреть температуру ЦП (для перевода в градусы Цельсия — полученное значение нужно  разделить на 10 и отнять 273,15).
11Winver

или

Ver

Показать окно с версией установленной системы.

-//-

Отобразить версию ОС прямо в окне CMD.

12HostnameУзнать текущее имя ПК.
13wmic path softwarelicensingservice get OA3xOriginalProductKeyКоманда покажет текущий лиценз. ключ Windows.
14Отображение сведений о лицензии (подробно, кратко).

Запуск консоли… или нет!

Когда пользователь *NIX хочет запустить инструмент командной строки, то сначала запускает терминал. Тот затем запускает оболочку по умолчанию или может быть настроен для запуска определённого приложения/инструмента. Терминал и приложение командной строки взаимодействуют потоками символов через

Однако в Windows всё работает иначе: пользователи Windows никогда не запускают консоль (conhost.exe) — они сразу запускают оболочки командной строки и приложения, например, Cmd.exe, PowerShell.exe, wsl.exe и прочее. Windows подключает запущенное приложение к текущей консоли (если оно запущено из командной строки) или к вновь созданному экземпляру консоли.

#SAYWHATNOW?

Да, в Windows пользователи запускают приложение командной строки, а не саму консоль.

Если пользователь запускает приложение командной строки из существующей оболочки командной строки, то Windows обычно присоединяет вновь запущенный .exe к текущей консоли. В противном случае Windows запустит новый экземпляр консоли, к которому будет присоединено только что запущенное приложение.

Немного занудства: многие говорят, что «приложения командной строки запускаются в консоли». Это не так и приводит к большой путанице относительно того, как в реальности работает консоль и приложения командной строки! Приложения командной строки и их консоли запускаются в независимых процессах Win32. Помогите исправить это заблуждение. Всегда говорите, что «средства командной строки/приложения выполняются с подключением к консоли». Спасибо!

:/>  Как открыть командную строку в Windows 10. 4 способа!

Звучит неплохо, правда? На самом деле… нет. Есть некоторые проблемы:

  1. Консоль и приложение командной строки взаимодействуют сообщениями IOCTL через драйвер, а не через текстовые потоки
  2. Windows указывает, что ConHost.exe — это консольное приложение, подключенное к приложениям командной строки
  3. Windows создаёт «каналы» (pipes), по которым взаимодействуют консоль и приложение командной строки

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

Увы, ситуация тут не очень хорошая. Есть отличные сторонние консоли и серверные приложения для Windows (например, ConEmu/Cmder, Console2/ConsoleZ, Hyper, Visual Studio Code, OpenSSH и т. д.), но им приходится прибегать к изощрённым трюкам, чтобы работать как обычная консоль!

Например, сторонним консолям приходится запускать приложение командной строки вне экрана, скажем, с координатами (-32000, -32000). Затем отправлять нажатия клавиш на внеэкранную консоль, скрапить с экрана текстовое содержимое внеэкранной консоли — и повторно выводить его в собственном пользовательском интерфейсе!

Какое-то безумие, верно?! Тот факт, что эти приложения вообще работают — лишь доказательство изобретательности и целеустремленности их создателей.

Очевидно, что мы стремимся исправить эту ситуацию. Об этом тоже расскажем в следующих статьях.

Когда 7 бит недостаточно: кодовые страницы

Однако 7 бит не обеспечивают достаточно места для кодирования многих диакритических знаков, знаков препинания и символов, используемых в других языках и регионах. Так что с добавлением дополнительного бита можно расширить таблицу символов ASCII дополнительными наборами «кодовых страниц» для символов 128−255 (и возможного переопределения нескольких непечатаемых символов ASCII).

Например, IBM ввела кодовую страницу 437 с несколькими графическими символами вроде ╫ (215) и ╣(185) и математическими, включая π (227) и ± (241), а также переопределила печатные символы для обычно непечатаемых символов 1−31:

pasta/cli.md at master · codedokode/pasta · GitHub
Кодовая страница 437

Кодовая страница Latin-1 определяет множество символов, используемых языками на основе латиницы:

pasta/cli.md at master · codedokode/pasta · GitHub
Кодовая страница Latin-1

Во многих окружениях командной строки и оболочках можно изменять текущую кодовую страницу, чтобы терминал отображал различные символы (в зависимости от доступных шрифтов), особенно для символов со значением 128−255. Но неправильно указанная кодовая страница приведёт к отображению кракозябр. И да, «кракозябры» — это настоящий термин! Кто бы мог подумать? 😉

Когда 8 бит недостаточно: юникод

Кодовые страницы временно решили проблему, но у них много недостатков, например, они не позволяют отображать текст одновременно из нескольких кодовых страниц/языков. Таким образом, пришлось ввести новую кодировку, которая точно отображает каждый символ и алфавит для всех языков, известных человечеству, оставляя ещё много свободного места! Представляем

Юникод — это международный стандарт (ISO/IEC 10646), который в данный момент определяет 137 439 символов из 146 современных и исторических письменностей, а также многие символы и глифы, в том числе многочисленные смайлики, которые широко используются практически в каждом приложении, платформе и устройстве. Юникод регулярно обновляется дополнительными системами письменности, новыми/исправленными смайликами, символами и т. д.

Юникод также определяет «непечатаемые» символы форматирования, которые позволяют, например, соединить символы и/или повлиять на предыдущие или последующие символы! Это особенно полезно в письменностях вроде арабской, где лигатура конкретного символа определяется окружающими.

pasta/cli.md at master · codedokode/pasta · GitHub
Эмодзи кота-ниндзя Microsoft

Механика windows console


Консоль Windows — обычный исполняемый файл Win32. Изначально он написан на C, но большая часть кода сейчас переносится на C по мере того, как разработчики модернизируют и разбивают на модули кодовую базу.

Если вам интересны такие вещи: многие спрашивали, Windows написана на C или C . Ответ такой: несмотря на объектно-ориентированный дизайн NT, как и большинство ОС, Windows почти полностью написана на C! Почему? Потому что C увеличивает потребление памяти и привносит накладные расходы на выполнение кода. Даже сегодня скрытые затраты на выполнение кода C могут удивить, но ещё в 1990-х, когда память стоила около $60/МБ (да… $60 за МЕГАБАЙТ!), скрытые затраты на vtables и прочее были значительными. Кроме того, затраты на косвенное обращение к виртуальным методам и разыменование объектов в то время могли привести к очень значительным потерям производительности и масштабированию кода C . В наше время нужно соблюдать осторожность, но издержки производительности C на современных компьютерах вызывают намного меньше беспокойства. Часто это приемлемый компромисс, учитывая безопасность, читабельность и лучшую сопровождаемость кода… именно поэтому мы постепенно переписываем код консоли на современном C !

Мощь powershell

Cmd сохраняется в Windows по сей день (

). Поскольку его основная задача — обеспечить максимальную обратную совместимость, Cmd редко улучшается. Даже «исправление ошибок» зачастую затруднено, если эти «баги» существовали в MS-DOS или более ранних версиях Windows!

В начале 2000-х оболочка Cmd уже устарела: Microsoft и её клиенты срочно нуждались в более мощной и гибкой командной строке. Из этой потребности появился PowerShell (который возник из «Манифеста Монады» Джеффри Сновера).

PowerShell — это объектно-ориентированная оболочка, в отличие от оболочек на основе файлов/потоков, которые принято использовать в мире *NIX: вместо потоков текста PowerShell обрабатывает потоки объектов. Он предоставляет авторам скриптов возможность прямого доступа и манипуляций с объектами и их свойствами вместо написания множества скриптов для анализа и обработки текста (как sed/grep/awk/lex/др.).

Созданные на базе .NET Framework и среды Common Language Runtime (CLR), язык и синтаксис PowerShell разработаны для объединения богатства экосистемы .NET со многими распространёнными и полезными функциями из множества других языков сценариев оболочки с акцентом на то, чтобы скрипты обеспечивали максимальную консистентность и исключительную… ну… мощь. 🙂

Обработка юникода

К сожалению, консоль Windows и её API появились до изобретения Юникода!

Консоль Windows хранит текст (который впоследствии выводится на экран) как символы кодировки UCS-2 с двумя байтами на символ. Эта кодировка поддерживает кодирование первых 65536 позиций символов, что известно как плоскость 0 или основная многоязычная плоскость (Basic Multilingual Plane, BMP).

Приложения командной строки выводят текст в консоли с помощью Console API. Обрабатывающие текст интерфейсы, бывают двух видов: функции с суффиксом А обрабатывают однобайтовые/символьные строки, функции с суффиксом W обрабатывают двухбайтовые (wchar)/символьные строки.

Например, функция WriteConsoleOutputCharacter компилируется в WriteConsoleOutputCharacterA() для проектов ASCII или в WriteConsoleOutputCharacterW() для проектов на Юникоде. Код может напрямую вызвать функцию с суффиксом …A или …W, если необходима обработка конкретного типа.

Примечание: каждый W API поддерживает UCS-2, потому что это всё, что существовало в момент разделения на A/W, и мы думали, что так будет хорошо. Но многие W API уже обновились для поддержки ещё и UTF-16 на том же канале.

Не все W API понимают UTF-16, но все они знают хотя бы UCS-2.

Кроме того, консоль не поддерживает некоторые новые функции Юникода, включая соединительные символы нулевой ширины (

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

Как же ввести эмодзи кота-ниндзя или сложные многобайтовые китайские/арабские символы в консоль? К сожалению, никак!

Мало того что консольный API не поддерживает символы Юникод больше двух байт на глиф (эмодзи NinjaCat требует 8 байт!), но внутренний буфер UCS-2 консоли тоже не может хранить дополнительные байты данных. Что ещё хуже, текущий GDI-рендерер консоли не сможет отрисовать глиф, даже если тот поместится в буфер!

Эх… Таковы радости legacy-кода.

Здесь опять я намерен прервать рассказ — вернёмся к этой теме в следующей статье. Оставайтесь с нами!

Перезагрузка и капитальный ремонт windows console

В конце 2022 года проект по созданию подсистемы Windows для Linux (WSL) шёл полным ходом, и на фоне взрыва оживлённого интереса пользователей к командной строке стало очевидно, что консоль Windows явно нуждается в некотором апгрейде.

В частности, консоли не хватало многих функций, привычных для современных *NIX-совместимых систем, таких как возможность парсинга и вывода последовательностей ANSI/VT, широко используемых в мире *NIX для вывода насыщенного и подсвеченного текста и текстовых UI.

В чём тогда смысл разработки WSL, если пользователь не сможет корректно использовать инструменты Linux?

Ниже пример того, что отображает консоль Windows 7 и Windows 10: обратите внимание, что Windows 7 (слева) не в состоянии правильно отобразить VT, сгенерированный линуксовыми программами tmux, htop, Midnight Commander и cowsay, но они корректно выглядят в Windows 10 (справа):

pasta/cli.md at master · codedokode/pasta · GitHub
Сравнение консоли Windows 7 и Windows 10

Так, в 2022 году была сформирована небольшая «группа Windows Console». На неё возложили задачу распутать, понять и улучшить кодовую базу Windows Console… которой к этому времени было около 28 лет — больше, чем программистам, которые работают над этим проектом.

Как подтвердит любой разработчик, которому когда-либо приходилось брать старый, грязный, плохо поддерживаемый код, улучшение такого кода представляет собой сложную задачу. Ещё сложнее не нарушить существующее поведение. Для обновления самой часто запускаемой программы в Windows, не нарушив работу миллионов клиентских скриптов, инструментов, скриптов авторизации, систем сборки, производственных систем, систем анализа и прочих, требуется немало «внимания и терпения». 😉

Для разработчиков проблема усугубилась, когда они поняли всю строгость требований к консоли со стороны клиентов. Например, если производительность консоли изменялась на 1−2% от сборки к сборке, то срабатывали сигналы тревоги в группе Windows Build, что приводило… гм… к «быстрой и прямой обратной связи», то есть требованию немедленного исправления.

Итак, когда мы будем обсуждать улучшения консоли и новые функции, помните, что есть несколько незыблемых принципов, которым должно соответствовать каждое изменение, в том числе:

  1. НЕ допускать новых уязвимостей
  2. НЕ ломать инструменты, скрипты, команды и т. д. у существующих клиентов (внутренних или внешних)
  3. НЕ снижать производительность и не увеличивать потребление памяти/IO (без чётких и хорошо доведённых причин)

За последние три года команда Windows Console провела следующую работу:

И работа продолжается! В настоящее время мы завершаем реализацию нескольких захватывающих новых функций.

К чему был этот урок истории?

Я надеюсь, вы поняли, что командная строка остаётся ключевым компонентом стратегии, платформы и экосистемы Microsoft.

Хотя для конечных пользователей Microsoft продвигала графический интерфейс, сама компания и её технические клиенты/пользователи/партнёры в значительной степени полагались на командную строку для выполнения множества технических задач.

На самом деле Microsoft буквально не смогла бы создать ни Windows, ни любой другой из своих программных продуктов без быстрой, эффективной, стабильной и безопасной консоли!

На протяжении эпох MS-DOS, Unix, OS/2 и Windows командная строка оставалась, пожалуй, самым важным инструментом в наборе инструментов каждого технического пользователя. Даже многие пользователи, которые никогда не вводили команды в окно, в реальности используют консоль каждый день!

:/>  Как открыть командную строку в Windows 10 от имени администратора

Перенаправления

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

команда < file.txt

Пайп (вертикальная черта) позволяет перенаправить выход одной программы на вход другой. Программа ls выводит список файлов в каталоге. Программа head -10 читает строки с стандартного ввода и выводит только первые 10 из них. Объединив эти команды, можно вывести имена первых 10 файлов:

ls | head -10

В линуксе есть и другие команды фильтры, которые можно применять вместе с пайпом. Это sort (сортирует результаты и позволяет удалять дубликаты), grep слово (отбирает строки, в которых встречается заданное слово), head -N (выводит первые N строк), tail -N (выводит последние N строк) и другие.

Перенаправить стандартный вывод в файл можно так:

ls > file.txt

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

Перенаправить поток ошибок в файл можно так:

команда 2> file.txt

Перенаправить и вывод, и ошибки в файл можно так:

команда 2>&1 > file.txt

Когда вывод перенаправлен в файл, ты не видишь ничего в консоли. Для борьбы с этим есть команда tee, которая расщепляет поток: одна копия идет в файл. другая выводится в консоль:

команда 2>&1 | tee file.txt

Команда tee по умолчанию при запуске очищает файл, если там что-то было, можно добавить параметр -a, чтобы она этого не делала, а дописывала строки в конец файла.

Подсистема windows для linux (wsl)

Основанные на GNU/Linux «дистрибутивы» (сочетания ядра Linux и коллекций инструментов пользовательского режима) становятся всё популярнее, особенно на серверах и в облаке. Хотя в Windows имелась POSIX-совместимая среда выполнения, но SFU не мог запускать многие инструменты и двоичные файлы Linux из-за дополнительных системных вызовов и различий в поведении по сравнению с традиционной Unix/POSIX.

После анализа обратной связи от разработчиков и технически подкованных пользователей Windows, а также в связи с растущим спросом внутри самой Microsoft, компания изучила несколько вариантов, и в конечном итоге решила позволить на Windows запуск оригинальных немодифицированных бинарных файлов Linux!

В середине 2022 года Microsoft сформировала группу разработки того, что станет подсистемой Windows для Linux (WSL). WSL впервые анонсировали в сборке Build 2022, а вскоре предварительная версия вышла на канале Windows 10 Insider.

С тех пор WSL обновляется в большинстве инсайдерских сборок и в каждом крупном выпуске ОС с момента Anniversary Update осенью 2022 года. В каждой новой версии увеличивается функциональность, совместимость и стабильность WSL: в первой версии это был интересный эксперимент, который мог запускать лишь несколько распространённых программ Linux.

Сегодня (середина 2022 года) WSL запускает большинство двоичных файлов Linux, программы, компиляторы, компоновщики, отладчикии т.д. Многие разработчики, IT-специалисты, инженеры DevOps и многие другие, кому необходимо запускать или создавать инструменты, приложения, службы Linux и т. д., получили резкое повышение производительности и возможность запускать свои любимые инструменты Linux вместе с любимыми инструментами для Windows на одном компьютере, без загрузки двух операционных систем.

Команда WSL продолжает улучшать WSL в части выполнения задач Linux, повышения производительности и интеграции с Windows.

Программы-фильтры

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

  • grep, egrep – отбирает только строки, соответствующие (или не соответствующие) регулярному
  • sort – сортирует поданные на вход строки
  • cat -n – нумерует поданные на вход строки
  • head, tail – берут первые или последние строки
  • tac – читает строки с входа, переворачивает их и выдает в обратном порядке
  • tr – заменяет указанные символы
  • sed – позволяет делать более сложные замены, например sed -rn 's!value=(d )!1n!gp' найдет во входном тексте строки вида value=123, выделит из них числа и выведет их каждое на своей строке
  • gzip/gunzip – архивируют/разархивируют данные
  • wc – считает число строк, слов и символов во входном файле
  • cut – разбивает каждую строку на куски по символу-разделителю и вырезает указанные куски

Подробнее:

Сложности с удалённой работой

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

На *NIX-платформах парадигма изолированности терминалов и приложений командной строки с простым обменом символами привела к тому, что там легко получить доступ и работать с удалённого компьютера/устройства. Если терминал и приложение командной строки обмениваются потоками символов по какой-то упорядоченной инфруструктуре (TTY, PTY и т.д.), то очень легко работать удалённо.

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

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

Современная командная строка

Современные компьютеры значительно мощнее «тупых терминалов» прошлого и обычно работают под управлением десктопной ОС (например, Windows, Linux, macOS) с графическим пользовательским интерфейсом (GUI). Такое окружение GUI позволяет нескольким приложениям работать одновременно в отдельных окнах на экране и/или невидимо в фоновом режиме.

pasta/cli.md at master · codedokode/pasta · GitHub
Cmd, PowerShell и Ubuntu Linux под WSL работают на независимых инстансах консоли

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

Аналогично и приложения командной строки, к которым подключены терминалы, работают как и раньше: получают входные символы, решают, что делать с этими символами, (необязательно) выполняют работу — и могут выдать текст для отображения пользователю. Только вместо связи по медленным каналам TTY терминальные приложения и приложения командной строки на одной машине общаются по очень скоростным каналам Pseudo Teletype (PTY) в памяти.

pasta/cli.md at master · codedokode/pasta · GitHub
Современная командная строка

Современные терминалы в основном взаимодействуют с приложениями командной строки, запущенными локально. Но конечно, они также могут взаимодействовать с приложениями командной строки, запущенными на других машинах в той же сети или даже с удалёнными машинами на другой стороне света через интернет.

Справочник по командам cmd windows

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

В разных версиях ОС семейства Windows набор поддерживаемых команд, их параметры командной строки, синтаксис и отображение результатов выполнения могут различаться. Одна и та же утилита командной строки может присутствовать в стандартной поставке одной версии Windows, но отсутствовать в другой, или входить в состав дополнительных средств, как например, Resource Kit или Software Development Kit.

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

Список команд постоянно обновляется и включает в себя все новейшие команды, добавляемые в стандартную поставку при выходе новых версий или обновлений ОС Windows 10.

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

ARP – просмотр и изменение таблиц ARP (Address Resolution Protocol)

ASSOC – просмотр или изменение сопоставлений расширений файлов приложениям

AT – управление планировщиком задач

ATTRIB – изменение атрибутов файлов

Auditpol – управление политиками аудита.

BASH – командная оболочка BASH в подсистеме Windows для Linux (WSL).

BCDBOOT – копирование в системный раздел файлов загрузки и создание
нового хранилища конфигурации загрузки (BCD)

BCDEDIT – редактирование хранилища данных конфигурации загрузки (BCD)

BOOTCFG – редактирование параметров загрузки в файле boot.ini

BOOTIM – вызов меню загрузки и восстановления (Выбор действия) Windows 10

BOOTREC – восстановление загрузочных записей и конфигурации загрузки Windows

BOOTSECT – редактирование загрузочных секторов для обеспечения загрузки NTLDR или BOOTMGR

BREAK – включить или выключить обработку комбинации клавиш CTRL C в DOS

CACLS – редактирование списков управления доступом к файлам (ACL – Access Control List)

CALL – вызов из командного файла подпрограмм или других командных файлов

CD – смена каталога (Change Directory)

Только для windows

Многие средства командной строки и приложения широко используют

В чём проблема? Они работают только под Windows.

Таким образом, в сочетании с другими различиями (например, в жизненном цикле и т.д.), приложения командной строки Windows не всегда легко переносятся под *NIX и наоборот.

Из-за этого в экосистеме Windows распространены свои собственные, часто похожие, но обычно отличающиеся средства командной строки и приложения. Это означает, что при использовании Windows пользователям приходится изучать один набор приложений и инструментов командной строки, оболочек, языков сценариев и т.д., а при использовании *NIX — другой набор.

У этой проблемы нет простого решения: консоль Windows и командную строку нельзя просто выбросить и заменить на bash и iTerm2 — существуют сотни миллионов приложений и сценариев, которые зависят от консоли Windows и оболочек Cmd/PowerShell.

Сторонние инструменты, такие как Cygwin, отлично переносят многие основные инструменты GNU и библиотеки совместимости в Windows, но не могут запускать непортированные, неизменённые бинарники Linux. Это очень важно, так как многие пакеты и модули Ruby, Python, Node зависят от бинарных файлов Linux и/или зависят от поведения *NIX.

Эти причины привели к тому, что Microsoft расширила совместимость с Windows, разрешив запуск аутентичных двоичных файлов и средств Linux в подсистеме Windows для Linux (WSL). С помощью WSL пользователи теперь могут загружать и устанавливать один или несколько дистрибутивов Linux бок о бок на одной машине, а также использовать apt/zypper/npm/gem/др. для установки и запуска подавляющего большинства инструментов командной строки Linux вместе с их любимыми приложениями и инструментами Windows.

Тем не менее, у нативной консоли остаётся функциональность, которая отсутствует в сторонних терминалах: в частности, Windows Console предоставляет сервисы command-history и command-alias, чтобы каждой оболочке (в частности) не пришлось повторно реализовать одинаковую функциональность.

Оставьте комментарий

Adblock
detector