在PowerShell中对齐Select-String的输出

Mic*_*ens 3 powershell

当我使用时,select-string我几乎总是希望我的输出对齐,即文件名,行号和找到的文本都应该对齐到列中.从视觉上看,它更不容忽视,通常可以更容易地发现差异.作为一个简单的例子,我在中间文件中注入了一个额外的空间:

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()
---
Run Code Online (Sandbox Code Playgroud)

不幸的是,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()
---
Run Code Online (Sandbox Code Playgroud)

有没有办法强制Select-String对齐其输出列?

编辑:哎呀!我忘记了一个重要部分:-Context如果可能的话,我还想包含参数,这样可以在匹配前后获得任意数量的行.

mjo*_*nor 7

使用对象:

Get-ChildItem *.cs | select-string -pattern override |
select Filename,LineNumber,Line | Format-Table -AutoSize
Run Code Online (Sandbox Code Playgroud)

如果您决定保留它,它也适合导出到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
Run Code Online (Sandbox Code Playgroud)

在这里获取New-PSObjectFromMatches函数:http://gallery.technet.microsoft.com/scriptcenter/New-PSObjectFromMatches-87d8ce87