Output filename, а не строка с select-string

Я использую powershell для "grep" моего исходного кода для конкретной строки. Если строка находится в файле, я хотел бы указать имя файла, а не строку кода, содержащую строку.

Мне также понравилось бы имя файла, только один раз, а не столько раз, сколько файл существует.

В настоящее время я использую:

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

Теперь я понимаю, что вывод select-string - это своего рода ojbect, и то, что я вижу в консоли, я предполагаю, ToString() этого объекта. Я предполагаю, что я мог бы использовать format-table для управления выводом строки выбора, и я полагаю, что sort получает только отдельные значения.

но это много угадывает.

Ответы

Ответ 1

Я не думаю, что полностью понимаю, что вы пытаетесь сделать. Если вы хотите, чтобы результат был сгруппирован по файлу, вы можете передать его в 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 - отличная помощь в определении того, какие свойства существуют на объекте:

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

Вместо этого вы можете использовать его псевдоним gm.

Ответ 2

Когда я это делаю, я просто использую параметр -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

Ответ 3

Мне было легче сделать

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