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

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 参数,这样人们就可以在比赛前后获得任意数量的行。

最佳答案

使用对象:

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

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

关于powershell - 在 PowerShell 中对齐 Select-String 的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15443277/

10-13 07:46
查看更多