archivo por lotes: cuenta el número de archivos en la carpeta y almacena en una variable

Soy muy nuevo en esto. por favor, ayúdame

Estaba tratando de escribir un programa de archivos por lotes para contar la cantidad de archivos en una carpeta y asignarlos a una variable y mostrarlos para verificar que se hayan almacenado. Por favor, ayúdenme con la sintaxis.

gracias de antemano-VK

preguntado el 12 de junio de 12 a las 21:06

10 Respuestas

Asumiré que no desea contar los archivos ocultos o del sistema.

Hay muchas maneras de hacer esto. Todos los métodos que mostraré involucran alguna forma del comando FOR. Hay muchas variaciones del comando FOR que parecen casi iguales, pero se comportan de manera muy diferente. Puede ser confuso para un principiante.

Puede obtener ayuda escribiendo HELP FOR or FOR /? desde la línea de comandos. Pero esa ayuda es un poco críptica si no estás acostumbrado a leerla.

1) El comando DIR enumera la cantidad de archivos en el directorio. Puede canalizar los resultados de DIR a FIND para obtener la línea relevante y luego usar FOR /F para analizar el valor deseado de la línea. El problema con esta técnica es que la cadena que busca tiene que cambiar según el idioma utilizado por el sistema operativo.

@echo off
for /f %%A in ('dir ^| find "File(s)"') do set cnt=%%A
echo File count = %cnt%

2) Puedes usar DIR /B /A-D-H-S para enumerar los archivos no ocultos/no del sistema sin otra información, canalice el resultado a FIND para contar la cantidad de archivos y use FOR /F para leer el resultado.

@echo off
for /f %%A in ('dir /a-d-s-h /b ^| find /v /c ""') do set cnt=%%A
echo File count = %cnt%

3) Puede usar un FOR simple para enumerar todos los archivos y SET /A para incrementar un contador para cada archivo encontrado.

@echo off
set cnt=0
for %%A in (*) do set /a cnt+=1
echo File count = %cnt%

Respondido el 22 de enero de 19 a las 23:01

¿Cómo especifica el directorio en el que desea contar en el primer método? - LoukMouk

@LoukMo: la respuesta asume el directorio actual. Para especificar una carpeta diferente, simplemente coloque la ruta después del comando DIR. - dbenham

@echo off
setlocal enableextensions
set count=0
for %%x in (*.txt) do set /a count+=1
echo %count%
endlocal
pause

Esto es lo mejor.... tu variable es: %count%

NOTA: puede cambiar (*.txt) a cualquier otra extensión de archivo para contar otros archivos.....

Respondido 02 Abr '15, 22:04

Esto funciona bien, pero tenga en cuenta que los archivos con la System or Hidden atributo (ej. attrib +s MyFile.txt) se cuentan con este script pero no se enumeran con dir! - AlainD

Esto es conceptualmente idéntico a la tercera opción en mi respuesta de 3 años antes. ¿Por qué publicar una respuesta idéntica? - dbenham

La david mugume respuesta falla en una carpeta vacía; Count es 1 en lugar de 0 cuando se busca un patrón en lugar de todos los archivos. Por ejemplo *.xml

Esto funciona para mi:

attrib.exe /s ./*.xml | find /v "File not found - " | find /c /v ""

contestado el 23 de mayo de 17 a las 11:05

El código más rápido para contar archivos con CUALQUIER atributo en la carpeta %FOLDER% y sus subcarpetas es la siguiente. El código es para la secuencia de comandos en un archivo de secuencia de comandos (por lotes).

@for /f %%a in ('2^>nul dir "%FOLDER%" /a-d/b/-o/-p/s^|find /v /c ""') do set n=%%a
@echo Total files: %n%.

Respondido el 22 de enero de 19 a las 23:01

Esto podría ser un poco más rápido:

dir /A:-D /B *.* 2>nul | find /c /v ""
`/A:-D` - filters out only non directory items (files)
`/B`    - prints only file names (no need a full path request)
`*.*`   - can filters out specific file names (currently - all)
`2>nul` - suppresses all error lines output to does not count them

Respondido el 11 de enero de 20 a las 08:01

Cambie al directorio y;

attrib.exe /s ./*.* |find /c /v ""

EDITAR

Supuse que sería fácil de descubrir. usar

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "batchfile.bat";
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();

Ejecuto esto y la variable output estaba sosteniendo esto

D:\VSS\USSD V3.0\WTU.USSD\USSDConsole\bin\Debug>attrib.exe /s ./*.*   | find /c /v "" 13

donde 13 es el número de archivos. Debería resolver el problema.

respondido 29 nov., 16:09

El OP no pidió contar archivos en subcarpetas, por lo que no veo el motivo de /s opción. El OP solicitó que el resultado se almacenara en una variable, y su código no lo hace. - dbenham

for /F "tokens=1" %a in ('dir ^| findstr "File(s)"') do echo %a

Resultado:

C:\MyDir> for /F "tokens=1" %a in ('dir ^| findstr "File(s)"') do @set FILE_COUNT=%a

C:\MyDir> echo %FILE_COUNT%
4   // <== There's your answer

Respondido 02 Abr '15, 21:04

FOR /f "delims=" %%i IN ('attrib.exe ./*.* ^| find /v "File not found - " ^| find /c /v ""') DO SET myVar=%%i
ECHO %myVar%

Esto se basa en la (muy) publicación anterior que señala que el conteo sería incorrecto para un directorio vacío si usa DIR en lugar de attrib.exe.

Para cualquier otra persona que se haya atascado en la sintaxis para poner el comando en un bucle FOR, encierre el comando entre comillas simples (suponiendo que no las contenga) y escape pipes con ^.

Respondido el 07 de Septiembre de 15 a las 10:09

He usado un archivo temporal para hacer esto en el pasado, como este a continuación.

DIR /B *.DAT | FIND.EXE /C /V "" > COUNT.TXT

FOR /F "tokens=1" %%f IN (COUNT.TXT) DO (
IF NOT %%f==6 SET _MSG=File count is %%f, and 6 were expected. & DEL COUNT.TXT & ECHO #### ERROR - FILE COUNT WAS %%f AND 6 WERE EXPECTED. #### >> %_LOGFILE% & GOTO SENDMAIL
)

Respondido el 13 de Septiembre de 15 a las 23:09

Con una for bucle:

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i
echo %count%

sin/evitando for bucle:

(dir /b /a-d ^| find /v /c "?") | (set /p myVar=& cmd /c exit /b %myVar%)
set count=%errorlevel%
echo %count%

Probado en Win 10 cmd

Respondido el 17 de Septiembre de 21 a las 21:09

El primero ya se muestra, ¡pero el segundo es interesante! Pero podría simplificarse a dir /b /a-d | find /v /c "" | (set /p cnt= & cmd /c exit /b %cnt%). Por cierto, para que funcione en un archivo por lotes, la última parte debe cambiarse a cmd /c exit /b %%cnt%% - Jeb

Jeje, sabía que te gustaría; No he visto a nadie hacerlo antes :) - zimba

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.