我正在使用powershell来“grep”我的特定字符串的源代码。如果字符串在文件中,我想要文件的名称,而不是包含字符串的代码行。
我还想要一次该文件的名称,该文件的名称没有列出该文件存在的次数。
我目前正在使用:
gci . -include "*.sql" -recurse | select-string -pattern 'someInterestingString'
现在我明白select-string的输出是某种ojbect,我在控制台中看到的是,我猜,该对象的ToString()
。我假设我可以使用format-table
来控制select-string的输出,我想sort
只能得到不同的值。
但这是很多猜测。
答案 0 :(得分:35)
我认为我完全不明白你要做什么。如果您希望按文件分组输出,可以使用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
代替。
答案 1 :(得分:13)
当我这样做时,我只使用-List参数 - 是的,它确实显示了代码行,但每个文件只能获得一行(无论有多少匹配):
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)
我发现它更容易
(...|select-string "search").Path