Почему PowerShell отображает текст "DarkYellow" неправильно?

Я использую командлет Write-Host, чтобы изменить цвет моего приглашения, и заметил, что цвет DarkYellow не отображается как любой желтый, а серый! Здесь тест всех цветов

PS> 0..15 | %{ Write-Host "Hello, world!" -ForegroundColor $_ }

Я получил список всех значений перечисления с использованием плохого значения

PS> Write-Host "Hello, World!" -ForegroundColor foo

Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Grey, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White.

И я понял, что этот список "цветов консоли" каким-то образом соответствует настройкам для этого консольного окна/ярлыка, не так ли? Таким образом, DarkYellow будет таким 7-м, и он уверен, выглядит серым.

enter image description here

Какая связь между ForegroundColor, System.ConsoleColor и этими настройками ярлыков консоли? Почему темно-желтый цвет отображается как серый "из коробки"? Должен ли я изменить его? Будет ли это изменяться каждая консоль в моей системе или только этот ярлык?

Почему консоль настолько тонкая в Windows?!


Я на 64-разрядной версии Windows 7 Pro SP1, и я запускаю ярлык "Windows PowerShell" из меню "Пуск".

Ответ 1

У меня нет точных ответов, но у меня есть что-то такое! Я провел некоторое исследование (спасибо, Джейсон Ширк) и обнаружил, что System.ConsoleColor является просто индексом в таблице цветов, который должен быть представлен этим

enter image description here

В документации упоминается, что DarkYellow должен быть ochre" (RGB: 204, 119, 34).

| DarkYellow  | The color dark yellow (ochre). |

Выберите "По умолчанию" в меню верхнего окна окна приложения, и вы увидите общие "Свойства Windows консоли" (например, выше), которые изменят окно типа ConsoleWindowClass.

Выберите параметр "Экранный текст", и вы заметите, что он настроен на использование значения в месте DarkYellow. Я не знаю, почему они не использовали Gray или DarkGray рядом с ним! Нажмите на 7-ое поле (индекс для DarkYellow) и измените его на ocher значение RGB. Затем установите "Экранный текст" в Gray или DarkGray (если вы действительно не хотите, чтобы текст очерного текста был включен по умолчанию).

Все консоли командной строки, PowerShell и Git Bash (mingw) будут изменены (мои были).


У меня возникли небольшие проблемы с приглашением PowerShell из диалогового окна "Запуск". Он принял цвета, но не некоторые из моих других настроек (физический размер и размер буфера и т.д.). Я закончил использование scoop для установки concfg

PS> scoop install concfg
PS> scoop install sudo

и экспортировал мои хорошие настройки консоли

PS> concfg export > ~\.consolerc

и импортировал их в мое ошибочное приглашение с предубеждением (вы можете использовать sudo, также из совка или просто запустить приглашение администратора)

PS> sudo concfg import ~\.consolerc

И, фактически, concfg, казалось, экспортировал все, значения таблицы цветов и выбор! Здесь частичный дамп моей конфигурации (цветные части)

{
    "popup_colors":  "cyan,white",
    "dark_gray":  "#808080",
    "screen_colors":  "gray,dark_magenta",
    "dark_green":  "#008000",
    "blue":  "#0000ff",
    "dark_yellow":  "#cc7722",
    "red":  "#ff0000",
    "magenta":  "#ff00ff",
    "dark_red":  "#800000",
    "yellow":  "#ffff00",
    "dark_magenta":  "#012456",
    "cyan":  "#00ffff",
    "green":  "#00ff00",
    "dark_blue":  "#000080",
    "gray":  "#c0c0c0",
    "white":  "#ffffff",
    "black":  "#000000",
    "dark_cyan":  "#008080"
}

Ответ 2

Ли блог Холмс, PowerShell Noble Blue, говорит об этом немного, но на самом деле не объясняет, почему DarkYellow был изменен. Скорее всего, по умолчанию DarkYellow был нечитаемым с синим фоном.

Как вы, вероятно, выяснили, что System.ConsoleColor немного неправильно назван, поскольку он фактически не указывает цвет, он указывает индекс в таблицу цветов, которая может быть изменена ярлыками. Это, к сожалению, ограничение подсистемы консоли.

Если вы измените ярлык PowerShell.lnk, вы будете менять цвета только для себя и только при запуске PowerShell из этой ссылки. Если вы используете Start | Запустите или скажите команду cmd, затем запустите PowerShell из cmd, вы получите разные настройки.

Сообщение в блоге Ли должно дать вам достаточно подсказок, чтобы получить то поведение, которое вы предпочитаете.