Powershell 输出文件名,而不是带有选择字符串的字符串

Powershell 输出文件名,而不是带有选择字符串的字符串,powershell,grep,Powershell,Grep,我正在使用powershell为特定字符串“grep”我的源代码。如果字符串在文件中,我想要的是文件名,而不是包含字符串的代码行 我还希望文件名,只列出一次,而不是列出文件存在的次数 我目前正在使用: gci . -include "*.sql" -recurse | select-string -pattern 'someInterestingString' 现在我知道select string的输出是某种类型的ojbect,我在控制台中看到的是,我猜,该对象的ToString()。我假设我

我正在使用powershell为特定字符串“grep”我的源代码。如果字符串在文件中,我想要的是文件名,而不是包含字符串的代码行

我还希望文件名,只列出一次,而不是列出文件存在的次数

我目前正在使用:

gci . -include "*.sql" -recurse | select-string -pattern 'someInterestingString'
现在我知道select string的输出是某种类型的ojbect,我在控制台中看到的是,我猜,该对象的
ToString()
。我假设我可以使用
format table
来控制select字符串的输出,并且我假设
sort
只获取不同的值


但是这是很多猜测。

我想我不完全理解你想做什么。如果要按文件对输出进行分组,可以使用
-GroupBy
参数导入
格式表

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Format-Table -GroupBy Path
gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Select-Object -Unique Path
如果只想获得匹配文件的名称,而不需要任何其他信息,可以使用
选择对象
-Unique
参数:

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Format-Table -GroupBy Path
gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Select-Object -Unique Path
如果只对文件名感兴趣,而不管名称本身是否在层次结构中多次出现,则可以选择
Filename
属性


注意:
Get Member
cmdlet对于确定对象上存在哪些属性有很大帮助:

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Get-Member

您也可以使用其别名
gm

执行此操作时,我只使用-List参数-是,它确实显示代码行,但每个文件只显示一行(无论有多少匹配项):

或者,如果您确实只需要文件名:

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list | 
    Format-Table Filename

Filename
--------
CmdletInfo.cs
GetSnapinHelpCommand.cs
ParameterInfo.cs
XmlCommandBase.cs

我发现这样做比较容易

(...|select-string "search").Path

这正是我想要的详细答案。谢谢要使
选择对象
返回字符串而不是具有单个
路径
属性的对象,请使用
|选择对象-扩展属性路径-唯一
比上述(更通用的)解决方案简单得多+1.这种方法唯一的缺点是,如果二进制文件在搜索路径中,第一行可能是整个文件。@Tolga要删除二进制文件,只需在get childitem中使用
-exclude*.dll、*.pdb、*.cache、*.exe
,或出现的任何其他二进制扩展名即可。这样做,但每次在文件中找到搜索的字符串时,它都会返回文件的路径。