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.