2009-09-30 146 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