Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用powershell select string-Allmatch选择多列并展开属性?_Powershell_Select String - Fatal编程技术网

如何使用powershell select string-Allmatch选择多列并展开属性?

如何使用powershell select string-Allmatch选择多列并展开属性?,powershell,select-string,Powershell,Select String,我正在搜索文本文件(*.sql)的集合,以查找以9开头的8位数字。文件中可能有这些数字的多个实例,以及文件中每行上的多个实例。我只希望输出显示每个文件中每个8位数字的唯一匹配项。这就是我到目前为止所做的: Select-String "9[0-9]{8}" "*.sql" -AllMatches | Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | Select-Object -uni

我正在搜索文本文件(*.sql)的集合,以查找以9开头的8位数字。文件中可能有这些数字的多个实例,以及文件中每行上的多个实例。我只希望输出显示每个文件中每个8位数字的唯一匹配项。这就是我到目前为止所做的:

Select-String "9[0-9]{8}" "*.sql" -AllMatches | Select-Object FileName, @{N="Value";E={ $_.matches |  %{$_.groups[0].value}}} | Select-Object  -unique FileName,Value  
我的输出如下所示:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      {907500507, 907520700, 907520701, 907520703...} 
File1.sql                      {907520725, 907520727, 907520728, 907520729} 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      {990603919, 990603925, 990603926} 
File2.sql                      {991100103, 991100103}
File2.sql                      {990700023, 990700504, 990700521, 990740520...} 
File3.sql                      907500044
等等

我想做的是扩展数组,这样当我通过select-unique传递它时 实际上,我只会得到每个文件中包含的唯一8位数字

这就是我想要的:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      907500507
File1.sql                      907520700
File1.sql                      907520701
File1.sql                      907520703 
File1.sql                      907520725
File1.sql                      907520727
File1.sql                      907520728
File1.sql                      907520729 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      990603919
File2.sql                      990603925
File2.sql                      990603926 
File2.sql                      991100103
File2.sql                      990700023
File2.sql                      990700504
File2.sql                      990700521
File2.sql                      990740520 
File3.sql                      907500044
等等

我该怎么做?我当前的powershell命令是否可以改进


谢谢

好吧,基本上是用你现有的东西,有点。我正在对Select字符串找到的所有匹配项执行ForEach循环,并按文件名对它们进行分组。然后,对于每个文件,我通过组循环展开匹配,然后只为匹配的文本获取唯一的值。对于每个值,我输出一个包含文件名和匹配值的对象

ForEach($File in Select-String "9[0-9]{8}" "*.sql" -AllMatches | Group FileName){
    $File.group|select -expand matches|Select Value -Unique|%{
        new-object PSObject -property @{
            FileName=$File.Name
            Match=$_.value
        }
    }
}

我对命令进行了一些重新格式化,我认为PowerShell速记的简洁性使问题更难解决

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | `
    Select-Object  -unique FileName,Value 
原始命令为Select字符串返回的每个MatchInfo生成一个输出行。MatchInfo表示文本文件的匹配行。我相信当文件中的一行包含多个匹配值时,您将获得一个值数组

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Foreach-Object { 
        # $_ is MatchInfo for each matching line in file
        $fileName = $_.FileName 
        $_.Matches | Foreach-Object { 
            # $_ is RegexMatch for each match in line
            $_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
        } 
    } | Select-Object  -unique FileName,Value 
我对它进行了修改,以澄清我们希望每个MatchInfo中的每个RegexMatch都有一个输出对象,也就是说,每个匹配值都有一个输出对象

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Foreach-Object { 
        # $_ is MatchInfo for each matching line in file
        $fileName = $_.FileName 
        $_.Matches | Foreach-Object { 
            # $_ is RegexMatch for each match in line
            $_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
        } 
    } | Select-Object  -unique FileName,Value 

您好,谢谢您的快速回复和解释。上面的工作非常好,而且我能够扩展您的代码,以包括一些我在上面的示例中没有包括的其他属性。(我实际上正在搜索多个子目录,需要提取父目录名以包含在最终选择中)您的代码正常工作,但我在扩展它以包含我在多个子目录中搜索的文件的父目录名时遇到了问题(作为新对象的一部分)