2010-11-08 68 views
5

我有Get-ChildItem的结果,我想遍历这些,并显示它们的名称。默认情况下,如果我只是使用Write-Host然后我得到它沿行这样罗列出来:如何编写按列按列编排顺序排列的列表?

PerfLogs Program Files Program Files (x86) Python31 Temp Users Windows 

然而,说,我知道我想要它分成X列,我希望输出这样的代替:

PerfLogs     Python31  Windows 
Program Files    Temp 
Program Files (x86)  Users 

正如您所看到的,它首先在列中列出,然后跨过列。

任何想法如何得到这样的输出?理想情况下,它将使用最适合屏幕的列数,并且每列中的名称都对齐左侧。

更新:感谢罗马,我现在可以有我的Linux风格与目录颜色的'ls'输出。建立了他的更新后的脚本我有:

function color-ls 
{ 
    dir $args | Format-High -Print {  
     $item = $args 
     $fore = $host.UI.RawUI.ForegroundColor   
     $host.UI.RawUI.ForegroundColor = .{  
      if ($item[1].psIsContainer) {'Blue'} 
      elseif ($item[1].Extension -match '\.(exe|bat|cmd|ps1|psm1|vbs|rb|reg|dll|o|lib)') {'Red'} 
      elseif ($item[1].Extension -match '\.(zip|tar|gz|rar)') {'Yellow'} 
      elseif ($item[1].Extension -match '\.(py|pl|cs|rb|h|cpp)') {'Cyan'} 
      elseif ($item[1].Extension -match '\.(txt|cfg|conf|ini|csv|log|xml)') {'Green'} 
      else {$fore} 
     } 
     write-host $args[0] -NoNewLine 
     $host.UI.RawUI.ForegroundColor = $fore 
    } 
} 

输出:

http://dl.dropbox.com/u/2809/lscolor.png

+0

我很高兴你在某种程度上,它是专为精确地重复使用更新后的脚本。感谢你的鼓舞人心的想法。这将是很好,如果PowerShell有这个内置的,我已经提交了建议: https://connect.microsoft.com/PowerShell/feedback/details/620452/format-wide-add-an-option-to-output逐列 – 2010-11-10 05:30:24

回答

6

这是一个有趣的想法和任务。

更新:更新的脚本包含一些修复和改进。它还允许以多种方式自定义输出。请参阅脚本注释中的示例。

脚本格式High.ps1:

<# 
.SYNOPSIS 
    Formats input by columns using maximum suitable column number. 

.DESCRIPTION 
    Format-High prints the specified property, expression, or string 
    representation of input objects filling the table by columns. 

    It is named in contrast to Format-Wide which prints by rows. 

.EXAMPLE 
    # just items 
    ls c:\windows | Format-High 

    # ditto in colors based on PSIsContainer 
    ls c:\windows | Format-High -Print {$c = if ($args[1].PSIsContainer) {'yellow'} else {'white'}; Write-Host $args[0] -ForegroundColor $c -NoNewline} 

    # just processes, not good 
    ps | Format-High 

    # process names, much better 
    ps | Format-High Name 

    # custom expression and width 
    ps | Format-High {$_.Name + ':' + $_.WS} 70 

    # process names in colors based on working sets 
    ps | Format-High Name 70 {$c = if ($args[1].WS -gt 10mb) {'red'} else {'green'}; Write-Host $args[0] -ForegroundColor $c -NoNewline} 
#> 

param 
(
    [object]$Property, 
    [int]$Width = $Host.UI.RawUI.WindowSize.Width - 1, 
    [scriptblock]$Print = { Write-Host $args[0] -NoNewline }, 
    [object[]]$InputObject 
) 

# process the input, get strings to format 
if ($InputObject -eq $null) { $InputObject = @($input) } 
if ($Property -is [string]) { $strings = $InputObject | Select-Object -ExpandProperty $Property } 
elseif ($Property -is [scriptblock]) { $strings = $InputObject | ForEach-Object $Property } 
else { $strings = $InputObject } 
$strings = @(foreach($_ in $strings) { "$_" }) 

# pass 1: find the maximum column number 
$nbest = 1 
$bestwidths = @($Width) 
for($ncolumn = 2; ; ++$ncolumn) { 
    $nrow = [Math]::Ceiling($strings.Count/$ncolumn) 
    $widths = @(
     for($s = 0; $s -lt $strings.Count; $s += $nrow) { 
      $e = [Math]::Min($strings.Count, $s + $nrow) 
      ($strings[$s .. ($e - 1)] | Measure-Object -Maximum Length).Maximum + 1 
     } 
    ) 
    if (($widths | Measure-Object -Sum).Sum -gt $Width) { 
     break 
    } 
    $bestwidths = $widths 
    $nbest = $ncolumn 
    if ($nrow -le 1) { 
     break 
    } 
} 

# pass 2: print strings 
$nrow = [Math]::Ceiling($strings.Count/$nbest) 
for($r = 0; $r -lt $nrow; ++$r) { 
    for($c = 0; $c -lt $nbest; ++$c) { 
     $i = $c * $nrow + $r 
     if ($i -lt $strings.Count) { 
      & $Print ($strings[$i].PadRight($bestwidths[$c])) $InputObject[$i] 
     } 
    } 
    & $Print "`r`n" 
} 
+0

同意排序,这是该死的好。我只是在学习PowerShell,你能指点一下。{}在$ widths =中做了什么。{}? – esac 2010-11-08 20:53:50

+0

在宽度总和后,应该是$ bestwidths =($ widths)..如果只有一个文件,它会抛出一个异常。 – esac 2010-11-08 22:55:45

+0

'。{}'是* dot *操作符(在当前范围内调用)+由它调用的脚本块。但是在这种情况下,有一个更好的构造'@()',它也修复了您注意到的错误。我会尽快更新代码(还有其他一些小缺陷)。 – 2010-11-09 05:16:31