3

を使用するとき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()
---

残念ながら、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に揃える方法はありますか?

編集:おっと!重要な部分を 1 つ忘れていました。-Context可能であれば、パラメーターも含めて、試合の前後に任意の数の行を取得できるようにしたいと考えています。

4

3 に答える 3

7

オブジェクトの使用:

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

于 2013-03-16T02:17:46.333 に答える
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
于 2013-03-27T07:24:35.493 に答える