Поведение Enum (синтаксический анализ) в PowerShell / DotNet Core: как это работает? - PullRequest
0 голосов
/ 26 октября 2018

Если это поможет, я нахожусь на PowerShell Core, v.6.0.1 или v.6.1.0.Очевидно, что в некоторых версиях PowerShell синтаксический анализ -1 приводит к ошибке, но не в любой из моих систем.На самом деле, я могу получить «действительный» ConsoleColor с любым отрицательным числом.Я просто пытаюсь понять, почему это работает, и что это значит.


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

Я заметил, что код скрипта пытается использовать текущие значения [Console]::BackgroundColor и [Console]::ForegroundColor, но в моем сеансе PowerShell эти значениявозвращаются как -1, что не может быть использовано для их установки.

Я изменил скрипт, чтобы переопределить значения некоторыми цветами по своему выбору, если они еще не настроены, но затем яхотел также иметь возможность их сброса.[Консоль] :: ResetColor () сбрасывает цвета фона и переднего плана, поэтому я не могу использовать его, если один из них настроен, а другой нет.

Однако это работает:

[Console]::ForegroundColor = [Enum]::Parse([ConsoleColor], -1)

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

Почемувышеуказанная работа, но не [Console]::ForegroundColor = -1?

1 Ответ

0 голосов
/ 26 октября 2018

Мне интересно, что вы ищете.

Для документирования перечисления используйте:

[Enum]::GetValues([ConsoleColor]) | Select-Object @{n="Name";e={"$_"}},value__

Пример вывода:

Name        value__
----        -------
Black             0
DarkBlue          1
DarkGreen         2
DarkCyan          3
DarkRed           4
DarkMagenta       5
DarkYellow        6
Gray              7
DarkGray          8
Blue              9
Green            10
Cyan             11
Red              12
Magenta          13
Yellow           14
White            15

Ваш код выше приводит к ошибкездесь с PSv6.1

[Console]::ForegroundColor = [Enum]::Parse([ConsoleColor], -1)

Параметр исключения "ForegroundColor": "Значение перечисления ConsoleColor не определено для этого перечисления. Пожалуйста, используйте определенный цвет из перечисления."В строке: 1 символ: 1 + [Console] :: ForegroundColor = [Enum] :: Parse ([ConsoleColor], -1) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo: NotSpecified: (:)[], SetValueInvocationException + FullyQualifiedErrorId: ExceptionWhenSetting

Для резервного копирования цвета

$OldForegroundColor = $Host.UI.RawUI.ForeGroundColor
...