Могу ли я избежать цветового кода в Powershell, поэтому мне не нужно использовать -ForeGroundColor?

82
9

Можно ли использовать некоторый символ escape-кода цветового кода, поэтому мне не нужно указывать параметр -ForeGroundColor?


Итак, вместо:


write-Host "Hello World!" -ForegroundColor:Blue

Могу ли я сделать что-то вроде:


write-Host "Hello \{somethinghere to denote from this point it will be in BLUE color} World!" 

спросил(а) 2016-04-05T16:46:00+03:00 4 года, 6 месяцев назад
1
Решение
91

Здесь решение, которое распространяется вокруг powershell, не поддерживает escape-коды ANSI.


Это позволит вам указать, какой символ вы используете в качестве разделителя


function Write-Colored {
param(
[Parameter(Mandatory=$True, Position=1)]
[string]$text,
[Parameter(Mandatory=$True, Position=2)]
[string]$delimiter
)

$i = $text.Split($delimiter)

function pr ([string]$item, [System.ConsoleColor]$color){
Write-Host $item.Substring(1) -fore $color -NoNewline
}

foreach ($item in $i){
$colorcode = $item.ToCharArray()[0]

switch($colorcode){
"b" { pr $item Blue }
"r" { pr $item Red }
"g" { pr $item Green }
"y" { pr $item Yellow }
default { Write-Host $item -NoNewline }
}
}
}


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


ввод:
$text = "#rmy #gname #yis #bchris"

выводит что-то вроде

image


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


`n

для добавления новых строк в текст или добавьте write-host "" в нижней части вашей функции, если это необходимо.


Изменить: пересмотренный код будет немного более надежным

ответил(а) 2016-04-05T17:53:00+03:00 4 года, 6 месяцев назад
82

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


Function Write-HostFormatted{
param(
[parameter(Mandatory=$true)]
$text,
[parameter(Mandatory=$true)]
[alias("DefaultColour")]
[System.ConsoleColor]$Colour
)

$text -split "({[^}]+})" | ForEach-Object{
If($_ -match "({[^}]+})"){
# We need to change the colour
$Colour = $_.Trim("{}")
} else {
# Output text using the current colour
Write-Host -NoNewline $_ -ForegroundColor $Colour
}
}
# Add the trailing newline
Write-Host ""
}


Тогда вы можете называть его следующим образом:

Write-HostFormatted "This text is{Blue} Blue!{Red} Now this text is Red" White

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


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

ответил(а) 2016-04-05T17:32:00+03:00 4 года, 6 месяцев назад
41

Вы можете использовать $PSDefaultParameterValues ​​для установки цвета по умолчанию.


$PSDefaultParameterValues['Write-Host:ForegroundColor'] = 'Blue'

ответил(а) 2016-04-05T17:05:00+03:00 4 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема