我写了一个函数来搜索给定目录中的所有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
以下......
如您所见,我在CSV的匹配列中收到了System.Text.RegularExpressions.Match[]
。
在ISE中,没有输出到Export-Csv
的输出如下所示:
其他所有编程语言都告诉我括号意味着数组,所以我尝试用Matches
替换Matches[0]
并且没有骰子。
显然这些括号不是数组,但可能是属性或其他东西?有什么想法吗?
答案 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
}
}