将查询对象格式化为数组

时间:2019-06-18 21:21:40

标签: powershell

我需要在文件中搜索单个字符(足够容易),但是希望将它们放在表列中,并在相关列中包含行号和索引(行位置)。

我尝试在已定义的数组内外运行查询,但是for循环不断创建似乎是嵌套数组的数组。我发现自己位于PowerShell foo的末尾。

$obj = @()
$obj += @{
    line = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | Select-Object LineNumber
    index = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | % { $_.Matches } | Select-Object Index
    value = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | % { $_.Matches } | % { $_.Value }
    }
$obj | format-list

当前输出为:

Name  : index
Value : {@{Index=66}, @{Index=20}}

Name  : value
Value : {e, r}

Name  : line
Value : {@{LineNumber=775}, @{LineNumber=925}}

But I would prefer something like:

Value    LineNumber     Index
e        775            66
r        925            20

2 个答案:

答案 0 :(得分:0)

这是完成此任务的一种方法:

$charMatches = Select-String -Path '.\occurences.txt' -Pattern 'r','a','r','e' -AllMatches
$charMatches | Foreach-Object { 
    $line = $_.Linenumber
    $_.Matches | Select-Object @{ n='Value'; e={ $_.Value }}
                 @{ n='Linenumber'; e={ $line }}
                 @{ n='Index'; e={ $_.Index }}
    }

说明:

$charMatches存储一个MatchInfo对象数组。从这些对象中,您可以访问.LineNumber.Matches属性。 .Matches属性返回一个Match对象,该对象包含其他属性,例如.Value.Index

第一个Foreach-Object处理每个MatchInfo对象,这就是我们能够为属于该对象的所有匹配项在.LineNumber中存储$line的方式。

由于.Matches包含一个数组,我们将选择Select-Object命令处理要处理的每个数组元素,选择我们要输出的属性(索引和值)。

这里不需要Get-Content,因为您可以将文件传递到Select-String -Path

答案 1 :(得分:0)

谢谢AdminOfThings,您的回复使我非常接近,但是我仍然无法正确列出索引。一旦意识到可以双重方法,嵌套的forloop问题就解决了。完成下面的答案,再次感谢您!

$hit = Select-String -Path $file -Pattern 'r','e' -AllMatches | Foreach-Object{

New-Object -TypeName PSObject -Property @{
    LineNumber = $_.LineNumber
    Pattern = $_.Pattern
    Line = $_.Line
    Index = $_.matches.Index
    FileName = $_.Path
}
}
$hit | Format-Table -Wrap -Property Pattern,LineNumber,Index -AutoSize

Pattern LineNumber Index
------- ---------- -----
   e       775      66  
   r       925      20