none
Цветовое форматирование на выводе Select-Object RRS feed

  • Вопрос

  • Коллеги, всем доброго времени суток.

    Clear-Host
    
    Get-WmiObject Win32_Volume | Select-Object -Property `
        DriveLetter, `
        Label, `
        @{Name="Capacity"; Expression={"$($_.Capacity/1GB -as [int]) GB"}}, `
        @{Name="FreeSpace"; Expression={"$($_.FreeSpace/1GB -as [int]) GB" }}

    Подскажите, пожалуйста, как возможно изменить цвет объектов на выводе не задевая заголовки и не применяя команделту Write-Host?

    Где то видел подобный фокус применяли в выражении "Expression="" ", но никак не могу найти пример
    • Изменено ByBash88 19 октября 2020 г. 13:56
    19 октября 2020 г. 13:54

Ответы

  • Нашёл решение. Но этот фокус не рабатает на PowerShell ISE, т.к. данный редактор закрыт и больше не обновляется Microsoft, но присутсвует в Windows.
    Идеально работает на Windows 10. Не проверял на 7/8. Возможно потребуется обновить Net Framework

    Clear-Host
    # Цветовые палитры
    $color_0 = "$([char] 27)[0m"
    $color_1 = "$([char] 27)[1;38;5;100m"
    $color_2 = "$([char] 27)[1;38;5;200m"
    $color_3 = "$([char] 27)[1;37m"
     
    Get-WmiObject Win32_Volume |
        Select-Object DriveLetter, Label,
        @{
            Name = "Capacity";
            Expression = {"$color_1$($_.Capacity/1GB -as [int]) $($color_3)GB$color_0" }
            
         },
        @{
            Name = "FreeSpace";
            Expression = {"$color_2$($_.FreeSpace/1GB -as [int]) $($color_3)GB$color_0"}
            
         }
    
    

    Возможно кому-то будет полезна функция палитры цветов. Спасибо Lesser из CyberForum.ru

    Clear-Host
    Write-Host
     
    $esc = [char]27
     
    function Write-Color ($color)
    {
        if ($color -in ((0,4,5,12) + (16..21) + (52..57) + (88..92) + (124..126) + (232..238)))
        {
            $fg = 244
        }
        else
        {
            $fg = 0    
        }
     
        $num = " {0:000} " -f $color
        Write-Host -NoNewline "$esc[01;38;05;${fg};48;05;${color}m${num}"
    }
     
    Write-Host "`n System Colors (0..15):`n"
    for ($i = 0; $i -le 15; $i++) { Write-Color $i }
     
    Write-Host "`n`n Grayscale (232..255):`n"
    Write-Host -NoNewline ' '; for ($i = 232; $i -le 243; $i++) { Write-Color $i }
    Write-Host -NoNewline "`n "; for ($i = 244; $i -le 255; $i++) { Write-Color $i }
     
    Write-Host "`n`n 6x6x6 Cubic Palette (16..231):"
    foreach ($a in 16,124) {
     
        Write-Host
        for ($b = $a; $b -le ($a + 30); $b += 6)
        {
            Write-Host -NoNewline '  '; for ($c = $b; $c -le ($b + 5); $c++) {Write-Color $c}
            Write-Host -NoNewline '  '; for ($c = $b + 36; $c -le ($b + 41); $c++) {Write-Color $c}
            Write-Host -NoNewline '  '; for ($c = $b + 72; $c -le ($b + 77); $c++) {Write-Color $c}
            Write-Host
        }
    }
     
    Write-Host
    Как работает данная конструкция палитры цветов я не понимаю, но работает. Сила DoNet безгранична )
    • Помечено в качестве ответа ByBash88 8 ноября 2020 г. 14:53
    8 ноября 2020 г. 14:52

Все ответы

  • по идее можно обратиться к классу [console] но хз получится ли правильный результат 

    The opinion expressed by me is not an official position of Microsoft

    19 октября 2020 г. 14:35
    Модератор
  • по идее можно обратиться к классу [console] но хз получится ли правильный результат 
    Да, видел такие примеры, но вывод как вы уже подметили местами не правильный. Ищу... как только докопаю отпишусь результатами.

    • Изменено ByBash88 20 октября 2020 г. 14:29
    20 октября 2020 г. 14:28
  • Здравствуйте

    У Вас получилось изменить цвет объектов?


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    4 ноября 2020 г. 9:08
    Модератор
  • Здравствуйте

    У Вас получилось изменить цвет объектов?


    Приветствую. Пока нет, продолжаю искать... нашел конечно варианты но они не срабатывают при выводе на консоле. Как найду способ сразу же отпишусь.
    4 ноября 2020 г. 9:20
  • Спасибо! Это будет полезно для других пользователей, которые столкнутся с данной проблемой!

    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    4 ноября 2020 г. 9:25
    Модератор
  • Нашёл решение. Но этот фокус не рабатает на PowerShell ISE, т.к. данный редактор закрыт и больше не обновляется Microsoft, но присутсвует в Windows.
    Идеально работает на Windows 10. Не проверял на 7/8. Возможно потребуется обновить Net Framework

    Clear-Host
    # Цветовые палитры
    $color_0 = "$([char] 27)[0m"
    $color_1 = "$([char] 27)[1;38;5;100m"
    $color_2 = "$([char] 27)[1;38;5;200m"
    $color_3 = "$([char] 27)[1;37m"
     
    Get-WmiObject Win32_Volume |
        Select-Object DriveLetter, Label,
        @{
            Name = "Capacity";
            Expression = {"$color_1$($_.Capacity/1GB -as [int]) $($color_3)GB$color_0" }
            
         },
        @{
            Name = "FreeSpace";
            Expression = {"$color_2$($_.FreeSpace/1GB -as [int]) $($color_3)GB$color_0"}
            
         }
    
    

    Возможно кому-то будет полезна функция палитры цветов. Спасибо Lesser из CyberForum.ru

    Clear-Host
    Write-Host
     
    $esc = [char]27
     
    function Write-Color ($color)
    {
        if ($color -in ((0,4,5,12) + (16..21) + (52..57) + (88..92) + (124..126) + (232..238)))
        {
            $fg = 244
        }
        else
        {
            $fg = 0    
        }
     
        $num = " {0:000} " -f $color
        Write-Host -NoNewline "$esc[01;38;05;${fg};48;05;${color}m${num}"
    }
     
    Write-Host "`n System Colors (0..15):`n"
    for ($i = 0; $i -le 15; $i++) { Write-Color $i }
     
    Write-Host "`n`n Grayscale (232..255):`n"
    Write-Host -NoNewline ' '; for ($i = 232; $i -le 243; $i++) { Write-Color $i }
    Write-Host -NoNewline "`n "; for ($i = 244; $i -le 255; $i++) { Write-Color $i }
     
    Write-Host "`n`n 6x6x6 Cubic Palette (16..231):"
    foreach ($a in 16,124) {
     
        Write-Host
        for ($b = $a; $b -le ($a + 30); $b += 6)
        {
            Write-Host -NoNewline '  '; for ($c = $b; $c -le ($b + 5); $c++) {Write-Color $c}
            Write-Host -NoNewline '  '; for ($c = $b + 36; $c -le ($b + 41); $c++) {Write-Color $c}
            Write-Host -NoNewline '  '; for ($c = $b + 72; $c -le ($b + 77); $c++) {Write-Color $c}
            Write-Host
        }
    }
     
    Write-Host
    Как работает данная конструкция палитры цветов я не понимаю, но работает. Сила DoNet безгранична )
    • Помечено в качестве ответа ByBash88 8 ноября 2020 г. 14:53
    8 ноября 2020 г. 14:52
  • На стековерфлоу  Jaison Shirk предложил ещё вот такой вариант.

    dir -Exclude *.xml $pshome | Format-Table Mode,@{
        Label = "Name"
        Expression =
        {
            switch ($_.Extension)
            {
                '.exe' { $color = "93"; break }
                '.ps1xml' { $color = '32'; break }
                '.dll' { $color = "35"; break }
               default { $color = "0" }
            }
            $e = [char]27
           "$e[${color}m$($_.Name)${e}[0m"
        }
     },Length

    8 ноября 2020 г. 14:58
  • Спасибо, что поделились Вашим решением!


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    9 ноября 2020 г. 8:50
    Модератор