powershell grep

powershell - nombre de archivo de salida, no cadena con cadena de selección



powershell string (3)

Estoy usando powershell para "grep" mi código fuente para una cadena en particular. Si la cadena está en el archivo, me gustaría el nombre del archivo, no la línea de código que contiene la cadena.

También me gustaría el nombre del archivo, solo una vez, que no aparece en la lista tantas veces como existe el archivo.

Actualmente estoy usando:

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

Ahora entiendo que la salida de select-string es una especie de objeto, y lo que estoy viendo en la consola es, ToString() , el ToString() de ese objeto. Supongo que podría usar format-table para controlar la salida de la cadena de selección, y supongo que la sort solo obtiene valores distintos.

pero eso es un montón de adivinanzas.


Cuando hago esto, solo uso el parámetro -List. Sí, muestra la línea de código, pero solo obtienes una línea por archivo (no importa cuántas coincidencias haya):

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...

Si quieres el camino:

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

O si realmente solo quieres el nombre de archivo:

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


Me pareció más fácil de hacer

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


No creo que entienda completamente lo que estás tratando de hacer. Si desea que la salida se agrupe por archivo, puede canalizar a Format-Table con el parámetro -GroupBy :

gci . -include "*.sql" -recurse ` | select-string -pattern ''someInterestingString'' ` | Format-Table -GroupBy Path

Si desea obtener solo los nombres de los archivos que coinciden sin ninguna otra información, puede utilizar Select-Object con el parámetro -Unique :

gci . -include "*.sql" -recurse ` | select-string -pattern ''someInterestingString'' ` | Select-Object -Unique Path

Si está interesado solo en el nombre del archivo, independientemente de si el nombre aparece varias veces en su jerarquía, puede seleccionar la propiedad Filename .

Nota: el cmdlet Get-Member es una gran ayuda para descubrir qué propiedades existen en un objeto:

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

También puedes usar su alias gm en su lugar.