Powershell - Export-Csv打印“System.Text.RegularExpressions.Match []”而不是匹配

时间:2016-10-17 15:00:00

标签: regex powershell csv powershell-v4.0

我写了一个函数来搜索给定目录中的所有IP:

function searchips
{
    param(
        [Parameter(Mandatory=$false)][string]$dir = $(pwd)
    )

    ls -Recurse -Force `
    | Select-String -Pattern '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -AllMatches `
    | ? { 
        $matches = ($_.Matches | Select-Object -Unique)
        return $matches.Count -gt 1 -or $matches[0].Value -ne '127.0.0.1' 
    } `
    | select Path,Matches,FileName,LineNumber,Line
}

当我尝试将输出管道传输到CSV时,除匹配列外,一切都很好:

我的电话:searchips | Export-Csv outfile.csv

  • 我从目录

  • 中调用它
  • 请勿尝试在目录外调用此目录,因为它始终在pwd中运行。还需要解决这个问题......

它吐出outfile.csv以下......

enter image description here

如您所见,我在CSV的匹配列中收到了System.Text.RegularExpressions.Match[]

在ISE中,没有输出到Export-Csv的输出如下所示:

enter image description here

其他所有编程语言都告诉我括号意味着数组,所以我尝试用Matches替换Matches[0]并且没有骰子。

显然这些括号不是数组,但可能是属性或其他东西?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

Matches 是一个集合,但您无法在Matches[0]中使用Select-Object,因为它不是属性的名称。使用calculated property从包含集合的属性中获取值。

如果您只想要第一场比赛,可以使用以下内容:

select Path, @{n='Matches';e={$_.Matches[0].Value}}, FileName, LineNumber, Line

如果您希望所有匹配项都使用以下内容:

select Path, @{n='Matches';e={$_.Matches.Groups.Value -join '|'}}, FileName,
       LineNumber, Line

如果你想把每场比赛作为一个单独的记录,你需要这样的东西:

ForEach-Object {
  foreach ($ip in $_.Matches.Groups.Value) {
    New-Object -Type PSObject -Property @{
      Path       = $_.Path
      Match      = $ip
      FileName   = $_.FileName
      LineNumber = $_.LineNumber
      Line       = $_.Line
    }
  }