Цветной каталог в Powershell неверен для всего формата - PullRequest
3 голосов
/ 06 августа 2010

Я получил этот цветной сценарий dir от http://tasteofpowershell.blogspot.com/2009/02/get-childitem-dir-results-color-coded.html:

function ls {
  $regex_opts = ([System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularExpressions.RegexOptions]::Compiled)

  $fore = $Host.UI.RawUI.ForegroundColor
  $compressed = New-Object System.Text.RegularExpressions.Regex('\.(zip|tar|gz|rar)$', $regex_opts)
  $executable = New-Object System.Text.RegularExpressions.Regex('\.(exe|bat|cmd|ps1|psm1|vbs|rb|reg|dll|o|lib)$', $regex_opts)
  $executable = New-Object System.Text.RegularExpressions.Regex('\.(exe|bat|cmd|ps1|psm1|vbs|rb|reg|dll|o|lib)$', $regex_opts)
  $source = New-Object System.Text.RegularExpressions.Regex('\.(py|pl|cs|rb|h|cpp)$', $regex_opts)
  $text = New-Object System.Text.RegularExpressions.Regex('\.(txt|cfg|conf|ini|csv|log|xml)$', $regex_opts)

  Invoke-Expression ("Get-ChildItem $args") |
    %{
      if ($_.GetType().Name -eq 'DirectoryInfo') {
        $Host.UI.RawUI.ForegroundColor = 'DarkCyan'
        $_
        $Host.UI.RawUI.ForegroundColor = $fore
      } elseif ($compressed.IsMatch($_.Name)) {
        $Host.UI.RawUI.ForegroundColor = 'Yellow'
        $_
        $Host.UI.RawUI.ForegroundColor = $fore
      } elseif ($executable.IsMatch($_.Name)) {
        $Host.UI.RawUI.ForegroundColor = 'Red'
        $_
        $Host.UI.RawUI.ForegroundColor = $fore
      } elseif ($text.IsMatch($_.Name)) {
        $Host.UI.RawUI.ForegroundColor = 'Green'
        $_
        $Host.UI.RawUI.ForegroundColor = $fore
      } elseif ($source.IsMatch($_.Name)) {
        $Host.UI.RawUI.ForegroundColor = 'Cyan'
        $_
        $Host.UI.RawUI.ForegroundColor = $fore
      } else {
        $_
      }
    }
}

Он прекрасно работает, но я в большинстве случаев хочу использовать только имена файлов в широком формате.Поэтому после вызова выражения invoke я добавил

  Invoke-Expression ("Get-ChildItem $args") |
    %{
      if ($_.GetType().Name -eq 'DirectoryInfo') {
  :
  :
  :
        $_
      }
    } | format-wide -property Name
}

Теперь у меня ошибка.Только цвет второго столбца правильный;первый элемент в каждом столбце принимает цвет элемента во втором столбце.Например, если у меня есть

> ls

Directory     Program.exe

, то и Directory, и Program.exe будут красными, даже если Directory должен быть DarkCyan.Как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 06 августа 2010

Вместо того, чтобы переключать цвета переднего плана / фона хоста между отображением текста на экране, почему бы вам не использовать Write-Host, который дает вам немного больше контроля над отображаемым текстом (вы можете контролировать, когда выводятся строки ) например:

$_ | Out-String -stream | Write-Host -Fore Red

И для широкого использования списков вам придется самостоятельно обрабатывать форматирование столбцов, если вы не хотите обновлять данные формата XML для типов DirectoryInfo / FileInfo. Если вы не хотите этого делать, то вы можете написать каждое имя - дополненное соответствующим образом - с желаемым цветом. В последнем столбце установите для параметра -NoNewLine значение $ false:

$width =  $host.UI.RawUI.WindowSize.Width
$cols = 3   
ls | % {$i=0; $pad = [int]($width/$cols) - 1} `
       {$nnl = ++$i % $cols -ne 0; `
        Write-Host ("{0,-$pad}" -f $_) -Fore Green -NoNewLine:$nnl}
2 голосов
/ 10 ноября 2010

Просто подумал, что я укажу вам на этот вопрос, который я разместил и который выводит цветной вывод в стиле linux и правильно форматирует в столбцах. Как написать список, отсортированный лексикографически в сетке, перечисленной по столбцу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...