2010-06-17 22 views
12

Tengo un archivo de texto con una lista de nombres de macro (uno por línea). Mi objetivo final es obtener una impresión de cuántas veces aparece el nombre de la macro en los archivos del directorio actual.Tubería a la entrada de findstr

Los nombres de la macro están en C:\temp\macros.txt.

type C:\temp\macros.txt en el símbolo del sistema imprime la lista correctamente.

Ahora quiero canalizar esa salida a la entrada estándar de findstr.

type C:\temp\macros.txt | findstr *.ss (ss es el tipo de archivo en el que estoy buscando los nombres de las macros).

Esto no parece funcionar, no obtengo ningún resultado (muy rápido, no parece intentarlo en absoluto). findstr <the first row of the macro list> *.ss funciona.

También probé findstr *.ss < c:\temp\macros.txt sin éxito.

Respuesta

15

Creo que estás confundiendo un poco cómo funciona findstr. Se obtiene entrada (para encontrar cosas, no las cosas que se deben buscar) como un nombre de archivo (patrón) o desde stdin, pero las cosas que está buscando son siempre indicadas en la línea de comando como argumento findstr .

findstr foo xyz.txt 

encuentra la cadena en el archivo fooxyz.txt.

type meh.txt | findstr x 

encuentra la cadena x en la salida de la orden anterior (en este caso el contenido del archivo meh.txt - un buen residuos del comando type, mucho relacionado con el mal uso común de cat).

Ya que busca cuenta en lugar de las líneas reales en las que aparecen los nombres de las macros, sugiero un enfoque diferente. Esto supone que el archivo que contiene las macros de los enumera uno por línea:

for /f "delims=" %x in (macros.txt) do @(echo %x: & find /c "%x" *.ss) 

Los for repite indefinidamente el contenido de su archivo, la línea se refiere. A continuación, imprime el nombre que está buscando y ejecuta find /c, que en realidad cuenta las líneas coincidentes.

+1

¡Ya veo! ¿Hay alguna manera de verificar qué parámetro se puede tomar de una tubería? Su último comando funcionó bien, aunque la salida de 'find' es muy fea. ¡Gracias! – Gauthier

+0

Bueno, puede iterar manualmente (con 'for') sobre todos los archivos' * .ss' y arrojar 'find/c' en ellos, analizar su salida y formatearla usted mismo. Y bueno, la mayoría de las veces es bastante obvio lo que un programa acepta como entrada de canal ya que esa ruta se usa generalmente para grandes cantidades de datos que de otro modo se leen desde un archivo. Todavía tengo que ver un programa (los cmdlets de PowerShell no cuentan) que acepta argumentos arbitrarios también desde la canalización. – Joey

Cuestiones relacionadas