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