2009-09-30 79 views
15

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

我也喜欢文件的名称,只有一次,没有列出文件存在的次数。

我目前使用:

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

现在我明白了选择串的输出是某种ojbect,而我所看到的控制台,我猜,在该对象的ToString()。我假设我可以使用format-table来控制选择字符串的输出,我想sort只能得到不同的值。

但这是很多猜测。

回答

32

我不认为我完全理解你想要做什么。如果你想通过文件分组的输出,你可以管到Format-Table-GroupBy参数:

gci . -include "*.sql" -recurse ` 
    | select-string -pattern 'someInterestingString' ` 
    | Format-Table -GroupBy Path 

如果你想只匹配没有任何其他信息,该文件的名称,你可以使用Select-Object-Unique参数:

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代替。

+0

这正是我寻找的详细答案。谢谢! – 2009-09-30 18:26:45

13

当我这样做的话就用 - 列出的参数 - 是的,它不会显示的代码行,但你只能得到每个文件一行(无论多少场比赛有):

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

Commands\SnapinHelp\CmdletInfo.cs:27:  public List<XmlNode> InputTypes; 
Commands\SnapinHelp\GetSnapinHelpCommand.cs:124:   WriteXmlNodeList(c... 
Commands\SnapinHelp\ParameterInfo.cs:73:  XmlNode FindNode(XmlDocument doc) 
Commands\Xml\XmlCommandBase.cs:65:   RegisterInputType<XmlNode>(Proce... 

如果你想要的路径:

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

Path 
-------- 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\CmdletInfo.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\GetSnapinHelpCommand.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\ParameterInfo.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\Xml\XmlCommandBase.cs 

或者,如果你真的只想要的文件名:

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

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

比上面的(更一般的)解决方案简单得多... +1。 – 2012-01-06 12:00:03

+1

这种方法的缺点是如果二进制文件在搜索路径中,第一行可能是整个文件。 – Tolga 2014-12-30 12:16:35

+0

@Tolga要删除二进制文件,只需在** get-childitem **中使用'-exclude * .dll,* .pdb,* .cache,* .exe'或任何其他出现的二进制扩展名。 – SliverNinja 2015-08-13 15:07:12

1

我发现它更容易做

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

这有效,但每次在文件中找到搜索字符串时,它都会返回文件的路径。 – Rod 2017-09-27 17:49:07