¿Cómo contar el número de líneas en el archivo de texto y almacenar el valor en una variable usando el script por lotes?

Quiero contar el número de líneas en un archivo de texto y luego el valor debe almacenarse en una variable de entorno. El comando para contar el no de líneas es

 findstr / R / N "^" file.txt |  encontrar / C ":"

Remití la pregunta ¿Cómo almacenar el resultado de una expresión de comando en una variable usando scripts bat? Entonces lo intenté,

 set cmd = "findstr / R / N" ^ "archivo.txt | buscar / C": ""

Recibo el mensaje de error,

 ENCONTRAR: el formato de los parámetros no es correcto

¿Cómo podría deshacerme de este error?

Puede usar el ciclo FOR / F para asignar la salida a una variable.

Utilizo la cmd-variable , por lo que no es necesario escapar de la tubería u otros caracteres en la cadena cmd, ya que la expansión retrasada pasa la cadena “sin cambios” al FOR-Loop.

 @echo off cls setlocal EnableDelayedExpansion set "cmd=findstr /R /N "^^" file.txt | find /C ":"" for /f %%a in ('!cmd!') do set number=%%a echo %number% 

Hay una manera mucho más simple que todos estos otros métodos.

 find /v /c "" filename.ext 

Remanente de los días heredados de MS-DOS, al parecer. Más información aquí: http://blogs.msdn.com/b/oldnewthing/archive/2011/08/25/10200026.aspx

Ejemplo de uso:

 adb shell pm list packages | find /v /c "" 

Si su dispositivo Android está conectado a su PC y tiene el SDK de Android en su ruta, imprime la cantidad de aplicaciones instaladas en su dispositivo.

Inspirado por las publicaciones anteriores, una manera más corta de hacerlo:

 CMD.exe C:\>FINDSTR /R /N "^.*$" file.txt | FIND /C ":" 

El número de líneas

Intentalo. Funciona en mi consola.

EDITADO:

(el signo “$” eliminado)

 FINDSTR /R /N "^.*" file.txt | FIND /C ":" 

$ reduce el número en 1 porque acepta la primera fila como Nombre del campo y luego cuenta el número de filas.

Prueba esto:

 @Echo off Set _File=file.txt Set /a _Lines=0 For /f %%j in ('Find "" /v /c ^< %_File%') Do Set /a _Lines=%%j Echo %_File% has %_Lines% lines. 

Elimina el FindStr adicional y no necesita expansión.


- editado para usar la sugerencia de redirección de ChrisJJ. La eliminación del comando TYPE hace tres veces más rápido.

@ Tony: incluso puedes deshacerte del comando type %file% .

 for /f "tokens=2 delims=:" %%a in ('find /c /v "" %_file%') do set /a _Lines=%%a 

Para archivos largos, esto debería ser aún más rápido.