Powershell彩色目录列表在格式范围内不正确

时间:2010-08-06 02:55:01

标签: powershell colors directory

我从http://tasteofpowershell.blogspot.com/2009/02/get-childitem-dir-results-color-coded.html得到了这个彩色的dir脚本:

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-Expression ("Get-ChildItem $args") |
    %{
      if ($_.GetType().Name -eq 'DirectoryInfo') {
  :
  :
  :
        $_
      }
    } | format-wide -property Name
}

现在我有一个错误。只有第二列的颜色是正确的;每列中的第一项采用第二列中项目的颜色。例如,如果我有

> ls

Directory     Program.exe

然后,Directory和Program.exe都将为红色,即使Directory应该是DarkCyan。我怎么能纠正这个?

2 个答案:

答案 0 :(得分:3)

不是在显示文本到屏幕之间使主机的前景/背景颜色混乱,为什么不使用Write-Host,它可以让你对显示的文本有更多的控制(你可以控制输出换行的时间)例如:

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

对于广泛的列表使用,您需要自己处理列格式,除非您要更新DirectoryInfo / FileInfo类型的格式数据XML。如果您不想这样做,那么您可以用所需的颜色写出每个名称 - 适当填充。在最后一列中,将-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}

答案 1 :(得分:2)

以为我会指出你发布的这个问题,正确地输出了linux样式的彩色输出和格式。 How to write a list sorted lexicographically in a grid listed by column?