Обновленный ответ на часть 2: как заставить его работать в CSCRIPT
Наконец-то я нашел механизм включения последовательностей VT-100 в CSCRIPT в этом ответе суперпользователя. Я скопировал соответствующий текст из ответа и разместил его ниже.
К счастью, глобальное значение по умолчанию можно изменить с включить на отказаться. Раздел реестра HKEY_CURRENT_USER\Console\VirtualTerminalLevel
устанавливает глобальное поведение по умолчанию для обработки управляющих последовательностей ANSI. Создайте ключ DWORD
(при необходимости) и установите для него значение 1
, чтобы глобально включить (или 0
, чтобы отключить`) обработку ANSI по умолчанию.
[HKEY_CURRENT_USER\Console]
"VirtualTerminalLevel"=dword:00000001
Обратите внимание, что этот параметр реестра управляет значением по умолчанию, а это означает, что он влияет только на консольные приложения, которые явно не манипулируют режимом консоли, вызывая SetConsoleMode(...)
. Из этого следует, что, хотя значение реестра может помочь включить ANSI для приложений console-mode-oblivious, оно никак не повлияет на console-mode-savvy< /em>, которое (по какой-то причине) может явным образом отключить ANSI.
Обратите внимание, что изменение затрагивает только вновь запущенные окна консоли — оно не активирует VT-100 для уже существующих окон консоли.
В этой теме пользователь DosTips aGerman обнаружил, что вы можете включить escape-последовательности, асинхронно запуская PowerShell из вашего скрипта. PowerShell настраивает выходные данные для поддержки escape-последовательностей, и эта поддержка остается даже после выхода из PowerShell, пока ваш процесс CSCRIPT остается активным.
Например, вот некоторый код JScript, который активирует последовательности
var ps = WScript.CreateObject("WScript.Shell").Exec("powershell.exe -nop -ep Bypass -c \"exit\"");
while (ps.Status == 0) WScript.Sleep(50);
Мой оригинальный ответ на часть 1: почему это не работает в CSCRIPT
Ладно, думаю, у меня есть жизнеспособная теория, почему это не работает. Я считаю, что должен быть какой-то низкоуровневый способ/вызов/функция/метод (независимо) для передачи stdout на консоль, о котором знают только несколько внутренних команд. Я основываю это на том факте, что FINDSTR также не может отправлять на консоль функционирующие управляющие последовательности, как показано ниже:
![введите здесь описание изображения](https://i.stack.imgur.com/9FSR1.jpg)
Я уже показал, что и TYPE, и ECHO работают. Я также проверил, что SET /P работает (не показано). Поэтому я подозреваю, что cmd.exe был изменен для поддержки новых функций консоли Windows 10.
Я хотел бы увидеть некоторую документацию MS, описывающую необходимый механизм для отправки управляющих последовательностей на консоль.
person
dbenham
schedule
07.08.2016