Function Write-HostColoured{
[cmdletbinding()]
Param(
[parameter(Mandatory=$true,ValueFromPipeline=$true)]
$Input,
[parameter(Mandatory=$true)]
[string]$ColouredProperty,
[System.ConsoleColor]$Colour = "Red"
)
# Get all the note properties of the object which we need for output and determining conditional formatting.
$properties = $input | gm -MemberType NoteProperty | Select-Object -ExpandProperty name
# Find the property with the longest length. Used for aligning output.
$longestProperty = $properties | ForEach-Object{$_.Length} | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
# Check if the property to colour requested is in $properties
If($properties -notcontains $ColouredProperty){Write-Warning "Input object does not contain the property $ColouredProperty"}
# Insert Line break between objects.
Write-Host
ForEach($singleObject in $Input){
$properties | ForEach-Object{
Write-Host ("{0,-$longestProperty} : " -f $_) -NoNewline
# Check if the property requires a colour formatting
If($_ -eq $ColouredProperty){
Write-Host $singleObject.$_ -ForegroundColor $Colour
} Else {
Write-Host $singleObject.$_
}
}
# Insert Line break between objects.
Write-Host
}
}
Import-Csv C:\temp\data.csv -header "Col123fff1","cl2","col3","col4" | Write-HostColoured -ColouredProperty Col3
Пример вывода
Объяснение
Думайте, что вам нужно будет эволюционировать на основе вашего комментария, но давайте начнем с этого. Он будет принимать входной сигнал от объекта (тестируется с Import-CSV
), а затем имитировать вывод Format-List
. Пока он выводит с использованием Write-Host
, если обрабатываемое свойство соответствует $ColouredProperty
, тогда примените цвет переднего плана, определенный $colour
.
В настоящее время это работает только в том случае, если вам нужно покрасить один столбец, но я мог видеть, что он принимает хэш-таблицу для условного форматирования.
Сообщите мне, если мы на правильном пути.
Условная раскраска
Вы можете легко сделать раскраску условной базы по критериям, если вы измените, если заявление и добавить еще один пункт
If($_ -eq $ColouredProperty -and $singleObject.$_ -match "\d")
Это делает функцию менее передаче, но она будет работать. Я использовал это, чтобы выделить все имена файлов с номерами в них.
Get-ChildItem C:\temp -filter *.txt | Select Name,Length,Directory | Write-HostColoured -ColouredProperty Name
Комбинации 'писать-хозяина -NoNewLine' может помочь с этим. Потенциально со сложной логикой. Каковы ваши условия окраски? – Matt
Вы хотите [раскрасить каждую строку] (https://technet.microsoft.com/en-us/library/ff406264.aspx)? Некоторые элементы? Целая колонка? Было бы хорошо узнать, какой из них. – Matt
Извините, у вас есть свои условия. Чтобы убедиться, что вы можете сделать факсимильную копию своего вывода для примера? – Matt