我试图从文件中解析出模式,然后在文件中搜索这些字符串然后对它们进行分组。这是我得到的代码和错误
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文件。
答案 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进行迭代通过那个数组。