powershell - 在 PowerShell 中对齐 Select-String 的输出

标签 powershell

当我使用 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/

相关文章:

Powershell:计划任务在后台而不是前台运行脚本

powershell - 将 Cmdlet 输出与字符串连接起来

testing - 如何使用 powershell 最大化内存使用

powershell - 使用 GitHub 包注册表作为 PowerShell 包存储库

delphi - Delphi 的 PowerShell 自动化?

Powershell 中的函数 - 可以在字符串中调用它们吗?

powershell - 与Powershell脚本相关的错误

powershell - 使用 set-acl 和 powershell 设置继承和传播标志

bash - 是否可以将变量从 BASH 脚本传递到 Linux 上的 PWSH

azure - 通过 PowerShell 在 ADLS Gen2 中重命名文件名时出现异常