2013-03-15 54 views
3

選擇字符串的輸出當我使用select-string我幾乎總是希望我的輸出一致,即文件名,行號,並找到的文本都應該對準成列。從視覺上來看,它分散注意力更小,通常可以更容易地發現差異。作爲一個簡單的例子我在中間文件會注入一個額外的空間:對齊在PowerShell中

PS> Get-ChildItem *.cs | Select-StringAligned -pattern override 
--- 
FileWithQuiteALengthyName.cs : 34: protected override void Foo() 
ShortName.cs     : 46: protected override void Bar() 
MediumNameFileHere.cs   :123: protected override void Baz() 
--- 

不幸的是,Select-String沒有做到這一點;實際上它給了這個 - 你能在這裏看到額外的空間嗎?

PS> Get-ChildItem *.cs | Select-String -pattern override 
--- 
FileWithQuiteALengthyName.cs:34: protected override void Foo() 
ShortName.cs:46: protected override void Bar() 
MediumNameFileHere.cs:123: protected override void Baz() 
--- 

有沒有辦法強制Select-String調整其輸出列?

編輯: 糟糕!我忘了一個重要的部分:我想也包括-Context參數如果可能的話使人們可以前後賽後獲得任意行數。

回答

5

使用對象:

Get-ChildItem *.cs | select-string -pattern override | 
select Filename,LineNumber,Line | Format-Table -AutoSize 

,它也適合出口,如果你決定要保持它爲CSV。

並稱,要求能夠還使用情境相當複雜的事情。

function ssalign { 
begin {$display = @()} 
process { 
$_ -split "`n" | 
foreach { 
    $display += 
    $_ | New-PSObjectFromMatches -Pattern '^(.+)?:([\d]+):(.+)' -Property $null,File,Line,Text 
    } 
} 
end { 
$display | 
foreach {$_.line = ':{0,5}:' -f $_.line} 
$display | ft -AutoSize -HideTableHeaders 
} 
} 

Get-ChildItem *.cs | Select-StringAligned -pattern override | ssalign 

把那新PSObjectFromMatches功能位置: http://gallery.technet.microsoft.com/scriptcenter/New-PSObjectFromMatches-87d8ce87

+0

哥們yesssssss任何思考。謝謝 – 2016-10-06 18:28:26

4

這也許:

Get-ChildItem *.cs | select-string -pattern override | ft filename, linenumber , line -AutoSize 

或這樣的事情:

Get-ChildItem *.cs | select-string -pattern override | 
% { "{0,-20}{1,15}{2,70}" -f $_.filename, $_.linenumber , $_.line } 

中相應的字符串格式-f(「的第一部分的值{0,-20} {1,15} {2,70}「)已被檢查根據你比賽的lenght

+0

上,又增加要求我把(我的壞:-()你發佈你的答案後? – 2013-03-19 14:00:40

1

我給了對號@mjolinor了一件漂亮的代碼他提供,他投入它的努力。儘管如此,一些讀者可能會發現這種利益的變化,特別是與NameWidth和NumberWidth參數我提供格式的靈活性:

filter Select-StringAligned 
{ 
    [CmdletBinding()] 
    Param (
    [Parameter(Mandatory=$true,Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] 
    [string[]]$InputObject, 

    [Parameter(Mandatory=$true,Position=1)] 
    [string]$Pattern, 
    [int[]]$Context = @(0), 
    [int]$NameWidth = 35, 
    [int]$NumberWidth = 4) 

    select-string -Path $InputObject -Pattern $pattern -Context $Context | 
    % { 
     $entry = $_    

     if ($Context[0] -eq 0) { $offset = 0 } 
     else { $offset = @($entry.Context.PreContext).Count } 
     $linenum = $entry.LineNumber - $offset - 1 

     # For some reason need to special case the $list construction; otherwise acts like Context=(1,1) 
     if ($Context[0] + $Context[1] -eq 0) { 
      $list = $entry.Line 
     } 
     else { 
      $list = @($entry.Context.PreContext) 
      $list += $entry.Line 
      $list += $entry.Context.PostContext 
     } 
     $list | % { 
      if ($entry.FileName.length -lt $nameWidth) { $truncatedName = $entry.FileName } 
      else { $truncatedName=$entry.FileName.SubString(0,$NameWidth) } 
      "{0,-$NameWidth}:{1,$NumberWidth}: {2}" -f $truncatedName, $linenum++, $_ 
     } 
    } 
} 

下面是一個例子使用。 -NameWidth參數允許字段寬度小於(截斷)或大於(填充)文件名。

$pattern = "public" 
Get-ChildItem *.cs | 
Select-StringAligned -pattern $pattern -Context 0,2 -NameWidth 20 -NumberWidth 3