输出文件名,不是带select-string的字符串

Ral*_*ton 22 powershell grep

我正在使用powershell来"grep"我的特定字符串的源代码.如果字符串在文件中,我想要文件的名称,而不是包含字符串的代码行.

我也想要文件的名称,只是一次,没有列出文件存在的次数.

我目前正在使用:

gci . -include "*.sql" -recurse | select-string -pattern 'someInterestingString'
Run Code Online (Sandbox Code Playgroud)

现在我明白select-string的输出是某种ojbect,而我在控制台中看到的是,我猜,ToString()是那个对象的.我假设我可以format-table用来控制select-string的输出,我想sort只得到不同的值.

但这是很多猜测.

Joe*_*oey 41

我不认为我完全明白你想要做什么.如果您希望按文件分组输出,可以Format-Table使用-GroupBy参数输入:

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Format-Table -GroupBy Path
Run Code Online (Sandbox Code Playgroud)

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

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Select-Object -Unique Path
Run Code Online (Sandbox Code Playgroud)

如果您只对文件名感兴趣,无论名称本身是否在层次结构中多次出现,您都可以选择该Filename属性.


注意:Get-Membercmdlet在确定对象上存在哪些属性方面有很大帮助:

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Get-Member
Run Code Online (Sandbox Code Playgroud)

您也可以使用其别名gm.


Kei*_*ill 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...
Run Code Online (Sandbox Code Playgroud)

如果你想要路径:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Filename
--------
CmdletInfo.cs
GetSnapinHelpCommand.cs
ParameterInfo.cs
XmlCommandBase.cs
Run Code Online (Sandbox Code Playgroud)

  • 比上面的(更通用的)解决方案简单得多...... +1. (2认同)