首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么select-string不能从管道接收

为什么select-string不能从管道接收
EN

Stack Overflow用户
提问于 2014-03-24 08:37:21
回答 3查看 1.8K关注 0票数 0

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

代码语言:javascript
复制
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的内容类似于

代码语言:javascript
复制
8,coilevent,networkchange
8,coilevent,malfunction
8,coilevent,conflictwithpc

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

EN

回答 3

Stack Overflow用户

发布于 2014-03-24 10:45:25

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

代码语言:javascript
复制
Get-Content C:\events.txt | % { Select-String -Pattern $_ * } | ...

但是,不需要首先读取管道的输入。-Pattern接受一个字符串数组,因此您可以简单地使用子表达式中的模式读取文件:

代码语言:javascript
复制
Select-String -Pattern (Get-Content 'C:\events.txt') * | ...
票数 1
EN

Stack Overflow用户

发布于 2014-03-24 10:20:01

我认为您正在寻找类似的选项(请注意,select字符串别名sls只适用于powershell V3 ):

代码语言:javascript
复制
$patterns=gc c:\temp\events.txt 
ls c:\temp\*.csv |%{
     sls -Pattern $patterns $_ |Select-Object LineNumber,FileName|Format-Table -GroupBy FileName
}  
票数 0
EN

Stack Overflow用户

发布于 2014-03-24 11:00:54

Select-String期待一个模式的正则表达式参数。这是:

代码语言:javascript
复制
 Get-Content C:\\events.txt | Select-String -pattern $_  * 

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

然后,尾随*将被读取为一个位置参数的参数。

阅读select-string上的帮助,并查看

代码语言:javascript
复制
get-help about_regular_expressions

在考虑了@Ansgar的评论之后,您可能可以使用以下内容:

代码语言:javascript
复制
gci | sls -Pattern (gc c:\temp\events.txt) -SimpleMatch

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22604448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档