Professional Documents
Culture Documents
bucles FOR
Ejecuta el comando para cada uno de los elementos especificados en la lista:
ejemplo 1
NOTA: Si las extensiones de comandos están habilitadas, podemos suprimir las comillas
de una variable con el símbolo ~ :
for %%X in (%*) do echo %%~X (más información: for /?)
ejemplo 2
En el último ejemplo hemos movido las imágenes con formatos gráficos de internet a la
papelera del disco C:.
- Echar un vistazo a la papelera desde Windows ¿se ven? ¿Y desde MS-DOS?
- Vaciar la papelera desde Windows. ¿Se han borrado?
- Volver al día siguiente y comprobar que las imágenes siguen ahí: aunque tiremos de la
cadena 1000 veces, los documentos nunca desaparecerán.
Una curiosa forma de esconder documentos y que nadie los borre: en la basura.
ejemplo 3
El siguiente archivo BAT nos lista todos los archivos ejecutables (.exe, .com, .bat) del
directorio pasado desde línea de comandos. (Si no pasamos argumento, muestra los del
raíz)
@echo off
FOR %%X IN (%1\*.exe %1\*.com %1\*.bat) DO echo %%X
MEJORAS en el FOR
Cuando las extensiones de comandos están habilitadas (por defecto lo están, más
información: CMD /? ), el comando FOR admite una serie de parámetros que amplían su
funcionalidad:
Con el siguiente archivo bat creamos archivos txt vacíos, cuyo nombre y cantidad
especificamos desde línea de comandos:
A) ARCHIVO
X:\>type fich.txt
El corazón y el cerebro, las dos grandes vísceras
que se llevan la primacía de los sentimientos y de
la razón, son las que presiden el arranque de las
coplas de Jorge Manrique a la muerte de su padre.
El for va recorriendo todas las líneas, y cada línea se ha dividido en "tokens" (por defecto:
token=palabra). La variable del for almacena el primer token de cada línea.
tokens
Podemos seleccionar varios tokens mediante la cláusula tokens=, Los distintos tokens se
irán guardando en nombres de variable alfabéticamente consecutivas a partir de la variable
utilizada en el for:
En el siguiente ejemplo nos quedamos con los tokens (palabras) 1, 3 y 5 de cada línea:
Podemos escoger rangos, en el siguiente ejemplo nos quedamos con las 3 primeras
palabras y la 5:
delimitadores
En los ejemplos anteriores los "tokens" coincidían con las palabras, pues para separarlos
se han utilizado el espacio en blanco y la tabulación. Podemos modificar los delimitadores
con la cláusula delims=
Utilizamos como delimitadores los signos de puntuación (punto, coma, punto y coma, y dos
puntos) - no debe haber espacios entre ellos- y nos quedamos con el primer token:
Y utilizar otras cláusulas, como skip=nº, que se saltaría las n primeras líneas del archivo,
empezando a procesar en la n+1,
o eol=carácter, que interpreta las líneas que comienzan por ese carácter como líneas de
comentario y no serán procesadas,
o useback que cambia la semántica de la lista: (`comando`) , ('cadena') , (archivo)
("archivo1 archivo2 archivo3")
B) COMANDO
Observar el carácter de escape ^ necesario para que el pipe lo interprete dentro del
comando en lugar de ser interpretado para el FOR.
C) CADENA
FORMATOS DE SALIDA
O simplemente %~X, que elimina las comillas (si las tuviera) como vimos arriba.
@echo off
set cont=0
for /f "tokens=*" %%L in (%1) do (
for %%P in (%%L) do (
if /I "%%P"=="%2" set /A cont=%cont%+1
)
)
echo En %1 aparece %cont% veces la palabra %2
Por lo que el resultado final del programa será 0 ó 1 (depende de si el último IF de todos
es cierto o no)
La solución es utilizar una shell con "sustitución de variables retardada", donde las
variables que deseemos que se sustituyan en el mismo instante de su utilización las
encerraremos con admiraciones.
cmd /v:on
Aunque si deseamos que el programa bat se ejecute por defecto, con sustitución de
variables retardada, podemos añadir como primera línea:
SETLOCAL ENABLEDELAYEDEXPANSION