Как перехватить вывод в windows 10 cmd.exe и изменить, чтобы добавить цвет? - PullRequest
0 голосов
/ 18 сентября 2018

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

Давайте предположим, что моя консоль cmd.exe уже была изменена для поддержки рендеринга escape-кодов ascii2 для вывода цвета.

Я довольно долго искал решения, но большинство из того, что я нашел, сделано для linux / osx.Я нашел скрипт, который давал регулярное выражение в качестве входных данных, мог заменить текст, используя указанные правила. regex script

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

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

Я открыт для попытки powershell, если нетсуществуют другие эффективные жизнеспособные решения.

Регулярное выражение для определения, является ли строка ошибкой, просто ищет слово error

"\berror\b"

Это тот же поиск предупреждения

"\bwarning\b"

1 Ответ

0 голосов
/ 18 сентября 2018

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

#Python 2
from subprocess import Popen, PIPE

def invoke(command):
    process = Popen(command, stdout=PIPE, bufsize=1)

    with process.stdout:
        #b'' is byte. Per various other SO posts, we use this method to            
        #iterate to workaround bugs in Python 2
        for line in iter(process.stdout.readline, b''):
            line = line.rstrip()
            if not line:
                continue
            line = line.decode()

            if "error" in line:
                print (bcolors.FAIL + line + bcolors.ENDC)
            elif "warning" in line:
                print (bcolors.WARNING + line + bcolors.ENDC)
            else:
                print (line)

    error_code = process.wait()
    return error_code

Для этого я передал вывод команды build в файл.Затем я написал этот скрипт на Python для установки требуемой зависимости, перебрал содержимое файла, затем распечатал данные с соответствующей раскраской.

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

#Python 2
import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

class bcolors:
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'

def print_text():
    install('colorama')

    try:
        import colorama
        colorama.init()
    except:
        print ("could not import colorama")

    if len(sys.argv) != 2:
        print ("usage: python pretty_print \"file_name\"")
        return 0
    else:
        file_name = sys.argv[1]
        with open(sys.argv[1], "r") as readfile:
            for line in readfile:
                line = line.rstrip()
                if not line:
                    continue

                if "error" in line:
                    print (bcolors.FAIL + line + bcolors.ENDC)
                elif "warning" in line:
                    print (bcolors.WARNING + line + bcolors.ENDC)
                else:
                    print (line)
        return 0

if __name__ == "__main__":
    ret = print_text()
    sys.exit(ret)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...