为什么select-string不从流水线接收

时间:2014-03-24 08:37:22

标签: powershell powershell-v2.0

我试图从文件中解析出模式,然后在文件中搜索这些字符串然后对它们进行分组。这是我得到的代码和错误

PS D:\Shared_With_Pai\Testing> Get-Content C:\\events.txt | Select-String -pattern $_  * |Select-Object LineNumber,FileName|Format-Table -GroupBy FileName
Select-String : Cannot bind argument to parameter 'Pattern' because it is null.
At line:1 char:52
+ Get-Content C:\\events.txt | Select-String -pattern <<<<  $_  * |Select-Object LineNumber,FileName|Format-Table -GroupBy FileName
+ CategoryInfo          : InvalidData: (:) [Select-String], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SelectStrin
gCommand

有谁可以说我犯了错误?

修改 events.txt的内容类似于

8,coilevent,networkchange
8,coilevent,malfunction
8,coilevent,conflictwithpc

我正在搜索这些行的一些csv文件。

3 个答案:

答案 0 :(得分:1)

如果您以这种方式使用对象,则当前对象变量$_不会填充来自管道的对象。正如@Kayasax建议的那样,如果你想让它像那样工作,你需要把语句放在一个循环中:

Get-Content C:\events.txt | % { Select-String -Pattern $_ * } | ...

但是,首先不需要从管道读取输入。 -Pattern接受一个字符串数组,因此您只需在子表达式中读取包含模式的文件:

Select-String -Pattern (Get-Content 'C:\events.txt') * | ...

答案 1 :(得分:0)

我认为你正在寻找类似的东西(请注意,select-string别名sls仅适用于powershell V3) :

$patterns=gc c:\temp\events.txt 
ls c:\temp\*.csv |%{
     sls -Pattern $patterns $_ |Select-Object LineNumber,FileName|Format-Table -GroupBy FileName
}  

答案 2 :(得分:0)

Select-String期望模式的正则表达式参数。这样:

 Get-Content C:\\events.txt | Select-String -pattern $_  * 

获取文件的内容,并将其用作管道数据和匹配参数 - 每条线都与自身匹配。这毫无意义。

然后将跟踪* after作为位置参数的参数读取。

阅读select-string的帮助,并参阅

get-help about_regular_expressions

在考虑了@ Ansgar的评论之后,你可以使用它:

gci | sls -Pattern (gc c:\temp\events.txt) -SimpleMatch

-Pattern参数不会接受管道输入,但它将采用一组模式参数,并将返回数组中任何模式的匹配,因此您不需要使用foreach-object进行迭代通过那个数组。