6 votos

Windows CMD script para contar archivos y obtener nombres de archivos

No estoy muy familiarizado con el CMD de Windows scripts y necesito escribir uno que compruebe el número de archivos en una carpeta específica y almacene los nombres de los archivos que se encuentran en las variables (tal vez un array). Esto es lo que tengo (%1 es la carpeta que obtengo como parámetro):

ECHO ### Checking the number of files under %1 ###
for %%x in (%1\pdf*.*) do (
 set file[!numFiles!]=%%~nxf
 set /a numFiles+=1
) 
ECHO ### Number of files found: %numFiles%

for /L %%i in (0,1,2,3,4) do (
   echo !file[%%i]!
)

0 votos

¿Por qué no utilizar un par de dir ¿comandos? Uno normal para analizar el recuento de las líneas de resumen, y otro con /b para obtener la lista de archivos.

0 votos

:: backslash-n se refiere a pulsar la tecla Enter \n echo ### Número de archivos encontrados: \n dir %1 | FIND /C "/" \n :: Esto no almacena cosas en variables, por lo que es sólo una respuesta parcial. Realmente estás pidiendo básicamente dos cosas, así que esto podría ser dos preguntas.

3voto

DavidPostill Puntos 30286

¿Cómo puedo contar los archivos de una carpeta específica y almacenar los nombres de los archivos en una matriz?

Hay una serie de problemas con su código:

  1. Es necesario enabledelayedexpansion si se va a utilizar más tarde.

  2. No has inicializado numFiles .

  3. %%~nxf debe ser %%~nfx .

  4. Su para /l tiene una sintaxis incorrecta (debería ser start,step,end ).

Aquí hay un archivo por lotes corregido (test.cmd):

@echo off
setlocal enabledelayedexpansion
ECHO ### Checking the number of files under %1 ###
set numFiles=0
for %%x in (%1\pdf*.*) do (
  set file[!numFiles!]=%%~nfx
  set /a numFiles+=1
 ) 
ECHO ### Number of files found: %numFiles%

set /a index=%numFiles%-1
for /L %%i in (0,1,%index%) do (
  echo !file[%%i]!
  )
endlocal

Ejemplo de uso y salida:

> dir *.pdf
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

21/02/2017  22:53                 0 pdf01.pdf
21/02/2017  22:53                 0 pdf02.pdf
21/02/2017  22:53                 0 pdf03.pdf
               3 File(s)              0 bytes
               0 Dir(s)  1,701,266,092,032 bytes free

> test .
### Checking the number of files under . ###
### Number of files found: 3
F:\test\pdf01.pdf
F:\test\pdf02.pdf
F:\test\pdf03.pdf

Más información

  • Índice A-Z de la línea de comandos CMD de Windows - Una excelente referencia para todo lo relacionado con la línea cmd de Windows.
  • enabledelayedexpansion - La expansión retardada hará que las variables se expandan en tiempo de ejecución y no en tiempo de análisis.
  • para - Realiza condicionalmente un comando en varios archivos.
  • para /l - Realiza condicionalmente un comando para un rango de números.
  • parámetros - Un argumento (o parámetro) de la línea de comandos es cualquier valor que se pasa a un script por lotes.

0 votos

¡Gracias! Casi perfecto. Sólo se me olvidó mencionar que necesito agarrar sólo el nombre del archivo (sin la ruta)...

0 votos

@RonaldoMaia Reemplazar %%~nfx con %%~nxx

0voto

Zimba Puntos 87

Para obtener una lista de nombres de archivos:

dir /b

Para obtener el número de archivos:

dir /b /a-d | find /v /c "?"

Para almacenar la lista de archivos en una variable 'archivos' (CSV delimitado por comas):

set files=""&for /f "delims=" %i in ('dir /b') do set files=!files!,"%i"
set files=!files:~3!

Los comandos anteriores son para el directorio actual. Para un directorio diferente, añada un sufijo al comando 'dir' con el nombre del directorio, por ejemplo, ".." o "c:\", etc.

Probado en Win 10

0 votos

¿Podría explicar qué es exactamente su find parte busca y lo que hace?

0 votos

Busca archivos sin nombres de archivo inválidos (es decir, archivos con nombres de archivo válidos), y muestra el recuento; dando como resultado el número de archivos que se muestran.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: