viernes, 4 de mayo de 2012

Comando FOR para archivos BAT

El comando FOR sirve para ejecutar bucles de instrucciones, y es una instrucción que se encuentra disponible en todos los lenguajes de programación. Un bucle son varias repeticiones de algunas instrucciones.


Este comando suele ser el más complicado de entender para las personas que empiezan a escribir archivos BAT complejos. Aqui intentaré explicar todas las opciones y usos del comando FOR, así como intentar resolver las dudas que los usuarios de Internet me puedan plantear.

Encontré una pagina muy interesante en la que se explicaba como funciona el comando FOR para los archivos BAT y había algunos ejemplos muy interesantes:

http://www.palomatica.info/juckar/microsoft/msdos/bat/for.html

Pero esa pagina fue borrada, con su valiosa información. Menos mal que la copié a tiempo y la puse aqui en mi blog:



La sintaxis normal del comando FOR es:

FOR %var IN (lista) DO ( 
    comando
    comando
     ...
)

Pero si lo vamos a usar dentro de un archivo BAT será así:

FOR %%var IN (lista) DO ( 
    comando
    comando
     ...
)


Observa que la variable "var" ahora va precedida por dos simbolos de "%". Además, si este for está dentro de un archivo BAT, el nombre de la variable debe ser UNA SOLA LETRA (p.ej: %%n, %%i,  %%j , etc )


EJEMPLO1


Para que la variable del FOR vaya tomando distintos valores dentro de una lista determinada:

for %A in (uno dos tres cuatro) do (
   echo %A
)

Esto sacará por pantalla las palabras que están entre parentesis, separadas linea a linea.

Y si el "for" está dentro de un archivo BAT, y tome los valores posicionales que se pasan cuando se llama al archivo desde la consola:

for %%x in (%*) do (
    echo %%x
)

EJEMPLO2

Si queremos recorrer una lista de archivos de un determinado directorio (solo archivos, no directorios):

for %f in (*) do (
   echo %f
)

y si queremos mover a la papelera de reciclaje algunos archivos con determinadas extensiones:

for %f in (*.jpg, *.mp3, *.bmp) do (
   move %f c:\recycler
)


MEJORAS EN EL FOR

RECURSIVIDAD:
FOR /R [ruta] %V IN (lista) DO comando
 

DIRECTORIOS:
FOR /D        %V IN (lista) DO comando   
 

LISTA CON CONTADOR:
FOR /L        %V IN (inicio, incremento, fin) DO comando 

RECORRIDO DE TOKENS EN LINEAS DE TEXTO:
FOR /F ["tokens=... delims=..."] %V IN (archivo | 'comando' | "cadena") DO comando


EJEMPLO3:  (parametro /R)

Recorrer y mostrar todos los archivos de la unidad C: empezando en su directorio raiz, y recorriendo recursivamente el resto de directorios que contiene:

for /R c:\ %v in (*) do (
   echo %v
)

Una variacion de este ejemplo sería el buscar un determinado tipo de archivos dentro de un directorio recursivamente. Voy a buscar todos los archivos "dll" y "exe" dentro del directorio "windows":

for /R c:\windows %v in (*.dll, *.exe) do (
   echo %v
)


EJEMPLO4: (parametro /D)

Si lo que me interesa es listar los directorios en vez de los archivos:

for /D %v in (*) do (
   echo %v
)

Y si lo quiero hacer recursivamente puedo añadir "/R" al comando anterior:

for /R /D %v in (*) do (
   echo %v
)
 
Y si quiero hacerlo recursivamente desde un directorio concreto (p.ej: c:\windows):

for /R c:\windows /D %v in (*) do (
   echo %v
)



EJEMPLO5: (parametro /L)

Para crear un tipico bucle contador de 1 a 10, saltando de 1 en 1:

for /L %x in (1, 1, 10) do (
   echo %x
)

Y saltando de 2 en 2

for /L %x in (1, 2, 10) do (
   echo %x
)

Y de 3 en 3:

for /L %x in (1, 3, 10) do (
   echo %x
)

etc.

Hay que observar que el primer numero dentro del parentesis es el valor inicial que tomará la variable "%x", el segundo numero es el incremento que sufrirá dicha variable en la proxima iteracion del FOR, y el tercer número es el valor máximo que tomará dicha variable y que cuando alcance o supere dicho valor, el bucle FOR terminará de ejecutarse.

EJEMPLO6:

Archivo BAT que crea varios archivos vacios y los llama a todos con el mismo nombre, pero terminados en un numero diferente:

@echo off
cls

set/p nombre=Indica el nombre de los archivos a crear:

set/p num=Cuantos archivos hay que crear?:

for /L %%x in (1, 1, %num%) do (
  echo 2> %%x%nombre
)


 EJEMPLO7: (parametro /F)

Recorrer un archivo y mostrar solo la primera palabra de cada linea:

for /F %%x in (fichero.txt) do (
  echo %%x
)

 El FOR va recorriendo todas las lineas, y cada linea se ha dividido en "tokens" (token=palabra). La variable del for almacena la primera palabra de cada linea.

EJEMPLO8: (parametro /F con tokens)

Podemos seleccionar varios tokens mediante la clausula tokens=. Los distintos tokens se irán guardando automáticamente en variables alfabeticamente consecutivas a partir de la variable creada en el for.

En el siguiente ejemplo nos quedamos con los tokens (palabras) 1, 3 y 5 de cada linea:

for /F "tokens=1,3,5" %%a in (fichero.txt) do (
  echo %%a %%b %%c
)

 observa que aunque yo solamente he definido la variable "%%a" en el FOR, las variables "b" y "c" se crean automaticamente.

Podemos escoger rangos, como en el siguiente ejemplo, en el que vamos a escoger los tokens del 1 al 3, y además el token 5

for /F "tokens=1-3,5" %%a in (fichero.txt) do (
  echo %%a %%b %%c %%d
)


O si queremos coger la linea completa a partir de la septima palabra:

for /F "tokens=7*" %%a in (fichero.txt) do (
  echo %%a
)

Y si queremos coger la linea completa:

for /F "tokens=*" %%a in (fichero.txt) do (
  echo %%a
)



 EJEMPLO8: (parametro /F con delimitadores)

Además de la clausula "tokens" con el parámetro "/F", podemos usar la clausula "delims", que indica la separacion entre los distintos tokens. Por defecto, los caracteres delimitadores entre tokens son los espacios en blanco y los tabuladores.

En el siguiente ejemplo anulamos los delimitadores y obtenemos lo mismo que antes:

for /F "delims=" %%a in (fichero.txt) do (
  echo %%a
)

Si queremos usar como delimitadores los simbolos de puntuacion, como el punto, la coma, el punto y coma, etc...:

for /F "delims=.,;:" %%a in (fichero.txt) do (
  echo %%a
)

esto solo imprimirá por pantalla la linea completa hasta que encuentre alguno de los delimitadores que le hemos indicado.

También se pueden combinar delimitadores y tokens:

for /F "tokens=7* delims=,." %%a in (fichero.txt) do (
  echo %%a
)

 También se pueden usar otras cláusulas como:

  • skip=n, que se saltaría las n primeras líneas del archivo, empezando a procesar la n+1
  • eol=carácter, que interpreta las líneas que comienzan por ese carácter como líneas de comentarios y se las salta.
  • useback, que cambia la semantica de la lista: (`comando`), ('cadena'), (archivo) ("archivo1" "archivo2" "archivo3")

EJEMPLO9: (uso de comandos dentro de la Lista)

Se puede sustituir la lista de valores que tiene que tomar la variable, por la ejecución de un comando, como en el siguiente ejemplo:

for /F "tokens=15 delims=:" %%a in (ipconfig ^| find IP) do (
  echo %%a
)

 Observar el caracter de escape "^" necesario para que la tubería se interprete dentro del comando en vez de ser interpretado para el for

EJEMPLO10: (parámetro /F con cadenas)

Podemos extraer distintas partes del valor de una variable. Por ejemplo, si mostramos el valor de la variable "date", nos dará una fecha con el siguiente formato:

07/05/2012

donde el dia, la fecha y la hora están separados por un carácter que sirve de delimitador: "/"

Para extraer las distintas partes de la fecha utilizamos el siguiente ejemplo (dentro de un archivo BAT):

for /F "tokens=1-3 delims=/:" %%a in (%date%) do (
  echo Hoy es %%a del mes %%b del año %%c
)

lo cual nos proporciona la siguiente salida por pantalla:

Hoy es 07 del mes 05 del año 2012


EJEMPLO 11: Variables dentro de un FOR

Hay veces que necesitamos usar y actualizar otras variables en el FOR, a parte de la que se crea en la cabecera del mismo, o incluso anidar un FOR dentro de otro FOR.

Para poder acceder a dichas variables hay que poner al principio del archivo BAT la siguiente linea (es MUY MUY IMPORTANTE ponerlo, porque sino no funcionará bien nuestro programa BAT):

setlocal enabledelayedexpansion

y además para acceder al valor de dichas variables hay que usar el simbolo de admiración "!", en lugar del simbolo "%"

Por ejemplo, el siguiente archivo BAT nos muestra la tabla de multiplicar de un numero que yo le indique por teclado:

tabla.bat

@echo off
cls
setlocal enabledelayedexpansion

rem En la variable num guardo que tabla de multiplicar quiero ver
set /p num=Quieres ver la tabla de multiplicar del numero...
cls

echo TABLA DEL %num%
echo ===============
echo .

for /L %%a in (1,1,10) do (
  set /a result=%num%*%%a
  echo %num% * %%a = !result!
  rem Hay que observar que para acceder al valor de la variable 
  rem "result" hay que cambiar los caracteres de porcentaje "%"
  rem por caracteres de admiracion "!"
)

Si quiero ver todas las tablas de multiplicar, debo anidar un FOR dentro de otro, y el archivo BAT quedaría así:

todastablas.bat

@echo off
cls
setlocal enabledelayedexpansion

for /L %%i in (1,1,10) do (

echo TABLA DEL %%i
echo ===============
echo .

    for /L %%a in (1,1,10) do (
      set /a result=%%i*%%a
      echo %%i * %%a = !result!

    )
    pause
    cls
)

Si no queremos usar el comando "setlocal enabledelayedexpansion" podemos ejecutar nuestro archivo BAT desde un terminal con "sustitución retardada". Para ello ejecutamos lo siguiente:

cmd /v:on

PETICIONES DE ARCHIVOS BAT DE LOS USUARIOS

Aquí iré añadiendo, cuando tenga tiempo, las soluciones a lo que me vais planteando los que comentais en esta entrada.

  • El usuario Nano me preguntó: 
"Me gustaría crear un archivo bat, el cual me mostrara la fecha de creación de un archivo.
el resultado debería ser:

La fecha del archivo es: 20/05/2013"

SOLUCIÓN:

@echo off
cls

echo Este programa BAT te pide el nombre de un archivo y te muestra la fecha en la que fue creado

dir

echo.

rem en la variable "archivo" meto el nombre del archivo
set /p archivo="Introduce el nombre del archivo:"

cls

rem ahora con el siguiente "for" extraigo (con el comando "find") la unica linea donde estan los caracteres "/" del listado que me saca el comando dir, porque ahi esta la fecha que quiero obtener

rem es muy importante poner las comillas simples en su lugar correspondiente

rem y tambien es muy importante poner el acento circunflejo "^" justo antes del caracter filtro "|", porque sino no funcionara

for /F "tokens=1" %%x in ('dir %archivo% ^| find "/"') do (
 echo El archivo %archivo% fue creado el %%x
)


  • La usuaria Alejandra me preguntó:

"Quiero recorrer a partir de un directorio todos los archivos y renombrar los que tienen una extension, por ejemplo jpg
tendria que renombrar todos incusive si hay subdirectorios."

Esto NO SE PUEDE HACER, porque a cada archivo le tendrías que poner un nombre diferente (no puede haber 2 o más archivos que tengan el mismo nombre y la misma extensión), tendrías que ir cambiandoselo uno por uno.


Sin embargo, si puedo cambiar la extensión de todos los archivos de un determinado directorio, que tengan una extensión en concreto (por ejemplo ".avi", ".mp3", o cualquier otra), este sería el archivo BAT:

SOLUCION


@echo off
setlocal enabledelayedexpansion
cls
echo Este archivo BAT recorre un directorio y sus subdirectorios y renombra los archivos que tengan una determinada extension:
echo.
echo.
set /p dir="Introduce la ruta del directorio:"
set /p ext="Introduce la extension de los archivos que se van a cambiar:"
set /p nueva="Introduce la nueva extensión que van a tener esos archivos:"
echo.
echo.

rem Me situo en el directorio en cuestion
cd %dir%

rem Cambio la extension de los archivos del directorio actual
ren *.!ext! *.!nueva!

rem Con el siguiente "for" me voy metiendo en los subdirectorios del directorio actual y les voy cambiando la extension a los archivos elegidos

for /D /R %%x in (*) do (
  cd %%x
  ren *.!ext! *.!nueva!
  cd ..
)



  • El usuario Anonimo me preguntó:

"Quiero hacer un archivo BAT que: Programe la ejecución de una copia de seguridad del contenido de una carpeta a otra a la hora que se pase como parámetro."

SOLUCION:

Aqui hay que preguntar 3 cosas al usuario: la carpeta que quiere copiar, la carpeta destino, y la hora a la que se efectuará esa copia. Y después usar el comando "at" para programar la tarea a una hora determinada, y el comando "xcopy" para copiar un directorio con todo su contenido.


@echo off

cls
set /p origen="Escribe la ruta de la carpeta que quieres copiar:"

set /p destino="Escribe la ruta de destino"
set /p hora="Escribe la hora a la que se hara esta copia: hh:mm"

at %hora% xcopy %origen% %destino%

Pero si la hora se la pasamos desde la linea de comandos sería así:

@echo off

cls
set /p origen="Escribe la ruta de la carpeta que quieres copiar:"

set /p destino="Escribe la ruta de destino"


at %1 xcopy %origen% %destino%

  • El usuario Anonimo también me preguntó:

"Quiero hacer un archivo BAT que: Muestre el nombre y tamaño de los archivos de la carpeta
activa cuyo tamaño sea superior a la cantidad que se indique como parámetro"

SOLUCION:

Con un for hay que ir recorriendo todos los archivos del directorio actual, y comparar su tamaño con el número de bytes que se le ha pasado como parametro posicional número 1 (%1).


@echo off
set enabledelayedexpansion
cls

echo Los archivos mas grandes de %1 bytes son:
echo.

REM Recorro todos los archivos del directorio actual y comparo si
REM su tamaño es mayor que el tamaño del archivo pasado por la
REM linea de comandos

for %%a in (*) do (
  for /F "tokens=3" %%t in ('dir /N /-C %%a ^| find "/"') do (
    if %%t gtr %1 echo %%a = %%t bytes
  )
)

REM He usado el caracter "/" para filtrar las lineas generadas
REM por el comando dir, puesto que las lineas que contienen ese
REM caracter, son las que tienen una fecha, y por tanto tienen
REM los datos de un archivo concreto.
REM Además uso las opciones /N y /-C del comando dir para que
REM se muestren todos los datos de los archivos, entre ellos
REM el tamaño, y la opcion /-C evita que aparezca el separador
REM de miles en el tamaño del archivo, que luego al hacer la
REM comparación me dará problemas si aparece.



  • El usuario Victor Castillejo me preguntó:

"Quiero hacer un archivo BAT que: me muestre la linea numero 4 de un archivo en concreto"

He hecho un archivo bat mejor que te pida el nombre de un archivo, y una linea inicial y una final y te imprima todas las lineas que están entre ambos numeros

SOLUCION:

@echo off
cls
setlocal enabledelayedexpansion

set/p nombre=Indica el nombre del archivo:
set/p numero=Indica el numero de linea inicial que quieres mostrar:
set/p final=Indica el numero de linea final que quieres mostrar:

set num=1

for /f "tokens=*" %%a in (%nombre%) do (
  if !num! geq %numero% (
    if !num! leq %final% echo %%a
  )
  set /a num = !num! + 1
)



  • El usuario Anonimo me preguntó:

"Quiero hacer un archivo BAT que me muestre las 30 ultimas lineas de un archivo en concreto"

He hecho un archivo bat mejor que te pida el nombre de un archivo, y las lineas finales, y te imprima las lineas finales que el usuario indique

SOLUCION:


@echo off
cls
setlocal enabledelayedexpansion

set/p nombre=Indica el nombre del archivo:
set/p lineas=Indica cuantas lineas quieres mostrar del final del

archivo:

set num=1

REM Con el siguiente for contare cuantas lineas tiene el archivo
for /f "tokens=*" %%a in (%nombre%) do (
  set /a num = !num! + 1
)

echo El archivo %nombre% tiene %num% lineas. Las ultimas %lineas% lineas son las siguientes:

echo.
echo.

REM En la variable inicio estara el numero de la linea desde la que tenemos que imprimir por pantalla
set /a inicio = !num! - !lineas!
set num=1

for /f "tokens=*" %%a in (%nombre%) do (
  if !num! geq %inicio% (
    echo %%a
  )
  set /a num = !num! + 1



  • El usuario Fran me preguntó:

"Quiero hacer un archivo BAT que lea un fichero que tiene un indice (un numero al principio de cada linea) y que las lineas que estan entre 0 y 249 las guarde dentro de un archivo (archivo1.txt) y las restantes lineas las guarde en otro archivo (archivo2.txt)"

SOLUCION:



@echo off
cls
setlocal enabledelayedexpansion

REM Los archivos resultantes van a ser "archivo1" y "archivo2"
REM Al principio, estos archivos deben estar vacios
echo. > archivo1.txt
echo. > archivo2.txt


set/p nombre=Indica el nombre del archivo:

REM ahora tomare las lineas del archivo de una en una
REM leyendo su primer token, que sera el indice, y el
REM resto de la linea, que sera lo que meta en el fichero
REM resultante
for /f "tokens=1,*" %%a in (%nombre%) do (
  if %%a lss 250 (
    echo %%a %%b >> archivo1.txt
  ) else (
    echo %%a %%b >> archivo2.txt
  )
)



  • El usuario Angel (anonimo) me preguntó:

"Quiero hacer un archivo BAT que recorra el árbol que cuelga de un directorio, y me copie un archivo determinado en cada uno de los directorios de dicho árbol"

SOLUCION:


@echo off

REM Guardo en la variable ruta la ruta del directorio actual
set ruta=%cd%

set /p nombre=Escribe el archivo del directorio actual que quieres copiar:

REM Ahora en la variable ruta, genero la ruta absoluta del
REM archivo que quiero copiar
set ruta=%ruta%\%nombre%

REM Con el siguiente FOR recorro recursivamente todos los
REM directorios del directorio actual y copio el archivo
REM que he seleccionado dentro de ellos
for /R /D %%v in (*) do (
   copy "%ruta%" "%%v\%nombre%"
)


  • El usuario Jorge Rainof me preguntó:

"Quiero hacer un archivo BAT que sume los datos numericos que se encuentran en las lineas de un fichero de texto. Estos numeros tienen separador de miles"

SOLUCIÓN:

@echo off
cls
setlocal enabledelayedexpansion


set suma=0

set /p archivo=Que archivo contiene los numeros para sumar?:

for /f "tokens=1-5 delims=." %%a in (!archivo!) do (
   set num=%%a%%b%%c%%d%%e
   set /a suma=!suma! + !num!
   echo + !num!
)

echo ------------------------
echo !suma!

pause



OTRA SOLUCIÓN (propuesta por Jorge Rainoff):

@echo off
cls
setlocal enabledelayedexpansion

set suma=0


set /p archivo=Que archivo contiene los numeros para sumar?:






REM en el siguiente "for", a diferencia del anterior, solo
REM voy a coger el primer "token", asi que no hace falta
REM que lo indique explicitamente en el "for".
REM En la variable "%%a" estará el número que quiero sumar,
REM y para quitarle los puntos intermedios, asigno su valor
REM a otra variable llamada "num", y a ésta le quito los
REM puntos con la siguiente instrucción: "set num=!num:.=!"
 

for /f %%a in (!archivo!) do (
  set num=%%a
  set num=!num:.=!
  echo + !num!
  set /a suma= !suma! + !num!
)

echo ------------------------
echo !suma!

pause



  • El usuario Anonimo me preguntó:

"Quiero hacer un archivo BAT que copie el ultimo archivo modificado a un directorio"

SOLUCIÓN:

@echo off
cls
setlocal enabledelayedexpansion

REM Este programa BAT copiara en el directorio "copia"
REM el ultimo fichero modificado en el directorio actual

set num=1

for /f "tokens=*" %%a in ('dir /o:-d /a:-d /b') do (
  if !num! equ 1 (
    echo El archivo modificado mas reciente es: %%a
    copy "%%a" copia
    dir copia\%%a
  )
  set num=2 
)



  • El usuario Fernando me preguntó:

"Quiero hacer un archivo BAT que extraiga un caracter de una variable usando un FOR"

Esto no lo puedes hacer con un for.

En los lenguajes de programación como Pascal, Java, C, etc. , existen funciones específicas que sirven para extraer una subcadena que se encuentre dentro de una cadena de caracteres, pero en la programación de archivos BAT no hay ningún comando que haga esto directamente (o por lo menos yo no lo conozco).

Se puede hacer una especie de bucle (usando etiquetas e instrucciones goto) que vayan pasando por el primer caracter de una variable ( usando " echo %variable:~0,1% " ) y lo vayamos desplazando un lugar hacia la izquierda ( usando " set variable=%variable:~1% " ). Así haremos que se vayan imprimiendo por pantalla todos los caracteres de la variable, linea por linea.

SOLUCIÓN:



@echo off
setlocal enabledelayedexpansion
cls

set /p frase="Escriba una frase: "

:bucle

  if "%frase%" equ "" goto fin

  set letra=%frase:~0,1%
  set frase=%frase:~1%
 

goto bucle

:fin
pause



  • El usuario Mauricio Espinosa Bustos me preguntó:

"Quiero hacer un archivo BAT que elija el archivo de mayor tamaño de un mes y un año concretos, cuyo nombre empiece por TARRO.D[fecha]"

Supongo que la fecha tiene este formato: dd-mm-aaaa

SOLUCIÓN:

@echo off
cls
setlocal enabledelayedexpansion

REM Este programa BAT mostrará cual es el archivo mayor
REM del directorio actual, que empieza por TARRO.D[fecha]

set /p mes="Indica el mes con dos digitos : "
set /p anio="Indica el anio con 4 digitos : "

set num=1

for /f "tokens=*" %%a in ('dir /o:-s /a:-d /b "TARRO.D*-%mes%-%anio%"') do (
  if !num! equ 1 (
    echo El archivo de mayor tamanio del mes %mes% es: %%a
  )
  set num=2 
)


  • Mi amigo y compañero Carlos Trujillo me comentó el otro día :

"Quiero hacer un archivo BAT que me cree automaticamente carpetas para cada dia del mes de un determinado año, para guardar las fotos que voy haciendo en ellas, clasificadas por días"

SOLUCIÓN:

@echo off
cls
setlocal enabledelayedexpansion


set /p mes="Escribe el mes : "
set /p anio="Escribe el anio : "


REM Voy a preguntar cuantos dias tiene el mes
REM para saber cuantas carpetas tengo que hacer

set /p dias="Cuantos dias tiene este mes? :"



for /L %%d in ( 1 , 1 , %dias% ) do (
  mkdir "fotos %%d-%mes%-%anio%" 
)



  • El usuraio Alcides Dominguez García preguntó :

"Tengo el archivo "datos.txt" que es como el siguiente:

86134 31965 01706 10304 20243 30011 40096 53006 61254 70500 333 10377 55103=
86170 32970 01604 10286 20203 39988 40089 53003=
86185 NIL=
86192 32970 00000 10282 20183 39895 40109 63204 52004=
86210 32570 11802 10302 20225 39769 40103 52020 81200 333 10374 55110
81833=
86218 31960 01504 10284 20219 30021 40116 53005 70400
55103=


en el que cada linea termina en el caracter "=". Quiero obtener aquellos valores de cada linea que empiecen por un numero concreto"

 SOLUCIÓN:

 @echo off
cls
setlocal enabledelayedexpansion

REM Voy a pedir al usuario que me diga que numeros quiere
REM ver por pantalla, dependiendo de su primer digito
 

set /p num=Por que digito empiezan los numeros que estas buscando? (0-9) :

REM voy a ir extrayendo linea por linea del archivo
REM "datos.txt" teniendo en cuenta que el caracter "="
REM marca el final de una linea

for /f "tokens=1 delims==" %%a in (datos.txt) do (
  set linea=%%a

  REM ahora voy recorriendo cada dato de la linea extraida

  for %%b in (!linea!) do (
    set dato=%%b

    REM comparo el primer digito de la variable "dato" con
    REM el criterio de busqueda que le indique al principio
    REM y si coinciden lo muestro por pantalla

    if "!dato:~0,1!" == "!num!" echo !dato!
  )
)



  • El usuraio Anonimo preguntó :

"Tengo el archivo "datos2.txt" que es como el siguiente:

000001 texto
000003 texto
000004 texto
000007 texto
..

en el que cada linea empieza por un numero de 6 digitos rellenado con ceros a la izquierda. Los numeros de esas lineas no son correlativos. ¿Como podría corregirlos automaticamente para que si lo fueran?"

SOLUCIÓN:

@echo off
cls
setlocal enabledelayedexpansion

set relleno=000000
set num=1

echo. > temporal.txt

REM recorro linea por linea el archivo "datos2.txt", le
REM quito el numero de 6 cifras que tiene al principio
REM para despues ponerle otro numero de 6 cifras
REM correctamente numerado, empezando por el 000001

for /f "tokens=1,*" %%a in (datos2.txt) do (
  set num2=!relleno!!num!
  set num2=!num2:~-6!
  echo !num2! %%b >> temporal.txt
  set /a num=!num!+1
)

REM Ahora sustituyo el archivo temporal.txt por datos2.txt

type temporal.txt > datos2.txt
del temporal.txt

pause





  • El usuraio Anonimo preguntó :

"Tengo varios archivos de texto, que contienen información. Quiero extraer automaticamente de cada uno de ellos las lineas que están entre las cadenas de caracteres "DISPENSER ERROR" y "RCLen".

He creado un archivo bat para extraer esas lineas de un archivo llamado "datos2.txt", aqui está la solución:

SOLUCIÓN:


@echo off
cls
setlocal enabledelayedexpansion

REM con el comando "find /n" voy a buscar la linea en la que
REM aparece la cadena de caracteres "DISPENSER ERROR", junto
REM con su numero de linea. Lo guardo en una variable
REM llamada inicio
for /f %%a in ('find /n "DISPENSER ERROR" datos2.txt ^| more

+2') do (
  set inicio=%%a
)

REM ahora busco el numero de linea en la que aparece "RCLen"
REM y lo guardo en la variable "fin"
for /f %%a in ('find /n "RCLen" datos2.txt ^| more +2') do (
  set fin=%%a
)

REM ahora necesito extraer el numero que se encuentra entre
REM los Corchetes [45], de la variable inicio, porque en
REM esa linea se encuentran "DISPENSER ERROR". Para ello
REM voy a hacer el siguiente bucle

set inicio=!inicio:~1!
set ini=

:bucle1

if "!inicio:~0,1!" == "]" goto :continuar

set ini=!ini!!inicio:~0,1!
set inicio=!inicio:~1!
goto bucle1

:continuar

REM ahora extraigo el numero de linea en el que se encuentra
REM la cadena RCLen, con el siguiente bucle

set fin=!fin:~1!
set final=

:bucle2

if "!fin:~0,1!" == "]" goto :continuar2

set final=!final!!fin:~0,1!
set fin=!fin:~1!
goto bucle2

:continuar2

REM ahora en las variables "ini" y "final" tengo los numeros
REM de las lineas que debo mostrar del archivo datos2.txt

set num=1

for /f "tokens=*" %%a in (datos2.txt) do (
  if !num! geq !ini! (
    if !num! leq !final! (
      echo %%a
    )
  )
  set /a num=!num!+1
)


V

275 comentarios:

  1. que grande Emilio, muy útil, gracias por el aporte

    ResponderEliminar
  2. Me gustaría crear un archivo bat, el cual me mostrara la fecha de creación de un archivo.
    el resultado debería ser:

    La fecha del archivo es: 20/05/2013

    ¿Sabría alguna orientación para desarrollarlo?

    un saludo: nano

    ResponderEliminar
    Respuestas
    1. Hola Nano, acabo de crear el archivo que me pedías. Lo he metido en la parte final de esta entrada. Saludos

      Eliminar
  3. Hola...muy interesante lo que escribis..estoy tratando de hacer lo siguiente pero no lo logro...quizás puedas ayudarme

    quiero recorrer a partir de un directorio todos los archivos y renombrar los que tienen una extension, por ejemplo jpg
    tendria que renombrar todos incusive si hay subdirectorios..
    gracias! :)

    ResponderEliminar
    Respuestas
    1. Hola Alejandra. Renombrarlos todos a la vez no puedes, puesto que a cada uno de ellos tienes que ponerles un nombre diferente, pero si les puedes cambiar la extensión a todos a la vez. Lo acabo de incluir en este articulo. Echale un vistazo para ver como se hace. Saludos

      Eliminar
  4. Excelente Post Emilio, es bueno ver que hay gente como tu que se esfuerza por explicar lo que es a veces complicado para otros. Felicitaciones y gracias.
    http://solucionok.blogspot.com

    ResponderEliminar
    Respuestas
    1. Muchas gracias Manuel. En el blog intento incluir cosas interesantes que voy encontrando por Internet, y además intento aportar las mias propias. Intentaré seguir metiendo más cosas útiles. Saludos

      Eliminar
  5. Buenas amigo.... tengo esta dudita me puedes ayudar???

    Lo que quiero que haga el bat, es que salga de for, y me indique cual es la clave que se pudo conectar. acá esta el que tengo..



    @echo off
    echo.
    echo.
    color 17
    set /p equipo= Escriba el numero de IP:
    set /p usar= Nombre del Usuario:
    SET /A NUM=0
    FOR /F "tokens=*" %%A IN (claves.txt) DO (
    echo La clave que utilizaremos es: %%A
    net use \\%equipo% /user:%equipo%\%usar% %%A
    set esta= %%A
    @if "%ERRORLEVEL%" == "2" goto fallo
    )
    :bien
    echo La clave fue encontrada!
    echo valor de retorno = %esta%
    goto fin
    :fallo
    echo Esta aplicación esta fallo!
    echo valor de retorno = %ERRORLEVEL%
    echo %%A
    goto fin
    :fin
    echo Listo.
    pause



    Claro lo que tengo acá, hce lo que quiero, pasea por el archivo .txt, y testeo todas las claves, pero eso es lo que no quiero... quiero que cuando arroje el error que el la conexión es correcta, salga del for y me indique cual es la clave, sin tener que esperar a que culmine la corrida completa, y luego buscar la clave que utilice y se conecto...

    Si me pueden ayudar... se los agradezco..je je...

    ResponderEliminar
    Respuestas
    1. Lo que tienes que hacer es poner un IF dentro del FOR para comprobar si la conexión ha sido correcta ( %errorlevel% == 0 ), y entonces salirte con un GOTO e ir a la etiqueta FIN. Además meto el contenido de la etiqueta "bien" dentro de este IF, y ya no es necesaria mas adelante. No veo para qué puede servir el comprobar el fallo que pones, así que lo quitaré. Sería más o menos así:


      @echo off
      echo.
      echo.
      color 17
      set /p equipo= Escriba el numero de IP:
      set /p usar= Nombre del Usuario:
      SET /A NUM=0

      FOR /F "tokens=*" %%A IN (claves.txt) DO (
      echo La clave que utilizaremos es: %%A
      net use \\%equipo% /user:%equipo%\%usar% %%A
      REM con este if compruebo si ha habido conexion correcta
      IF %errorlevel% == "0" (
      echo La clave es esta %%A
      goto FIN
      )

      )

      :fin
      echo Listo.
      pause

      Espero que asi te funcione. Saludos

      Eliminar
  6. Hola: me han planteado el siguiente ejercicio y no se como resolverlo:
    Crea un archivo de comandos (ejercicio2.cmd) que reciba como entrada dos rutas de directorios del sistema de ficheros. Sobre la segunda ruta (también en los subdirectorios, de forma recursiva) comprobará cuáles son los ficheros cuya fecha de ultima modificación coincide con la fecha actual (es decir, han sido creados o modificados el día que se ejecute el archivo de comandos). En la primera ruta creará un fichero con el listado de estos ficheros que han sido modificados en la fecha actual.

    Si se realiza una llamada incorrecta al fichero (porque falta o es errónea alguna de las 2 rutas), se informará al usuario de cómo invocar el archivo por medio de un mensaje de texto. Si se llevan a cabo todas las tareas correctamente, se mostrará un mensaje al usuario informando de este hecho.

    Esto es lo que he hecho pero no se como continuar con las fechas:
    @echo off
    cls
    REM Ejercicio 2

    echo bienvenido al ejercicio 2

    rem comprobamos parametros de entrada y su existencia y guardamos.

    set ruta1=%1
    set ruta2=%2

    rem comprobamos la existencia de carpetas
    if not exist "%ruta1%\." goto error1
    if not exist "%ruta2%\." goto error2
    set fechaHoy=%DATE%
    For /F "tokens=" %%a in ('dir /t:w "%ruta2%"') do (










    :error1
    echo "La ruta1:%ruta1% no existe"
    goto fin

    :error2
    echo "La ruta2:%ruta2% no existe"
    goto fin
    :fin
    echo Gracias por usar el programa

    Agradecería sugerencias.
    Un saludo

    ResponderEliminar
  7. Hola, me han mandado hacer los siguientes ficheros bat y por más que he probado cosas no he sido capaz de sacarlos. Si me pudieses ayudar te lo agradecería.

    Uno es este: Programar la ejecución de una copia de seguridad del contenido de una carpeta a otra a la hora que se pase como parámetro.
    En este lo he intentado con el comando robocopy y declarando una variable %date% con el argumento %2.

    Y el otro es este: Mostrar el nombre y tamaño de los archivos de la carpeta
    activa cuyo tamaño sea superior a la cantidad que se indique como parámetro.
    En este lo he intentado con pushd %cd% for /f "tokens=* delims=" %%i in ('dir /b /s') do if %%~zi gtr %%2 (echo %%~ni--%%~zi).

    Gracias.

    ResponderEliminar
  8. Resuelto. Mira las soluciones arriba dentro de la entrada

    ResponderEliminar
    Respuestas
    1. Excelente ayuda. Muchísimas gracias!

      Eliminar
  9. Hola,
    Tengo una duda. Si tengo un TXT y solo quiero capturar la 4 línea? Como lo hago? He saltado de línea con el Skip, pero me muesta el resto de líneas...

    fo /F "skip=3" %%a in (c:\hardware.txt) do (echo %%a)

    Con esto me imprimiría el resto del txt a partir de la 4 línea...HELPME!

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Victor, te lo he solucionado y mejorado. Buscalo al final de la entrada. Saludos

      Eliminar
  10. Hola Profesor,
    necesito un bat para eliminar subdirectorios y todo su contenido.
    La estructura de carpetas es:
    c:\prueba
    user1
    dms23854
    dms00254
    dms03654
    user2
    dms55874
    dms00114
    user3
    dms02587
    Los ficheros solo están dentro de las subcarpetas que empiezan por "dms".
    Hay que borrar las carpetas "dms" pero no se pueden borrar las carpetas user1, user2 y user3.
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Mario, prueba con el siguiente comando:

      rmdir /s /q dms*

      Dime a ver si te funciona. Saludos

      Eliminar
  11. amigo como puedo hacer un contador de lineas de un txt, necesito seleccionar y pegar las untimas 30 lineas de archivos TXT en un DOC

    ResponderEliminar
    Respuestas
    1. Hola, acabo de hacer un archivo bat que te pide el nombre del fichero de texto, cuantas lineas del final del archivo quieres imprimir por pantalla, y por ultimo te las muestra. Buscalo al final de este post. Saludos

      Eliminar
  12. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  13. Primero que todo darle las gracias por el artículo, es excelente. Tal vez me pueda ayudar con un problema que debe tener una solución sencilla pero no la encuentro. Siguiendo lo que dice en el artículo trato de hacer un batch que recorra un directorio y copie las imágenes del directorio y los subdirectorios a otra ruta. Lo hice de la siguiente manera:
    for /R "D:\" %%v in (*.jpg) do (
    COPY %%v D:\aa
    )
    Pero cuando ejecuta la copia me da el error "The system cannot find the file specified". Imagino que tenga que ver con las rutas, espacios o algo parecido.
    Alguna idea???
    Saludos y muchas gracias

    ResponderEliminar
  14. Hola amigo Yasmani. El problema que te da el sistema lo causa la ruta absoluta del archivo origen. Comprueba que esa ruta tiene algun espacio en blanco, como por ejemplo la carpeta "Documents and Settings", que tiene 2 espacios en blanco.

    Para solucionar este problema, lo que tienes que hacer es poner comillas dobles antes y despues de %%v, y se quedaría de la siguiente manera:

    for /R "D:\" %%v in (*.jpg) do (
    COPY "%%v" D:\aa
    )

    Eso es lo unico que tienes que modificar para que te funcione correctamente tu archivo bat.

    Pruebalo y luego me dices si te ha funcionado.

    Saludos

    ResponderEliminar
  15. Funciona 100% bien, muchas gracias amigo

    ResponderEliminar
  16. Emilio buen dia, desearia saber como hacer un script que lea un archivo txt, que contiene indices que van desde el 0 al 499, y este a su vez cuando encuentre los indices que van del 0 al 249, lo redireccione a un archivo de texto, lo mismo para lo restante, te agradezco desde ya, saludos.

    Fran

    ResponderEliminar
    Respuestas
    1. Hola Fran. Supongo que a lo que te refieres con los "indices" del archivo es que cada linea empieza con un numero.

      Si las lineas estan ordenadas por dicho indice, tienes que hacer un FOR que recorra todo el archivo. Dentro de este FOR debemos llevar un contador (una variable que al principio valdrá 0, y que vaya incrementandose de uno en uno hasta la ultima linea del archivo), que me diga en cada momento en la linea en la que estoy. Con este contador voy a controlar una estructura IF que la meteré dentro del FOR. Si el valor del contador es menor de 250, entonces guardar dicha linea en el primer archivo resultante, y si el valor del contador es mayor o igual que 250, entonces guardar dicha linea en el segundo archivo resultante.

      Ahora, sino están ordenadas las lineas por dicho indice, el contador no nos valdrá para nada, y tendremos que obtener el primer "token" de cada linea leida en el FOR, y usar el mismo IF que en el caso anterior.

      Eliminar
    2. Mira al final de la entrada, acabo de poner la solucion al problema que me planteas

      Eliminar
    3. Emilio, mil gracias, te agradezco mucho, es justo lo que estaba buscando, mil gracias en serio!!!, Exitos!!!

      Saludos,

      Fran

      Eliminar
    4. Me alegro de que haya gente educada que de las gracias. Saludos

      Eliminar
  17. Muchas gracias por este artículo.

    ResponderEliminar
    Respuestas
    1. Me alegro de que haya gente educada que de las gracias. Saludos

      Eliminar
  18. Muy buenas Profesor Emilio, aunque publico mi pregunta como anónimo , mi nombre es Ángel.
    Quisiera saber como hacer una copia de un sólo archivo en un directorio de carpetas y subcarpetas, es decir, deseo copiar por ejemplo manual.txt en un directorio con muchas carpetas y subcarpetas, pero el mismo archivo, sólo manual.txt. ¿ se puede eso?. Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola Angel. Si, lo que me preguntas si se puede hacer. El archivo BAT lo he puesto al final de esta entrada. Saludos

      Eliminar
  19. Hola profesor Emilio. excelente articulo y gracias por el gran apoyo...tengo entendido que una variable se puede "formatear" a la salida con echo %variable%:3-5% imprimira los caracteres 4 al 6 en pantalla de variable, ó %variable: e=a% cambiara en la cadena variable las e's por a's, y que el ciclo FOR /F puede usar delimitadores al trabajar con cadenas de texto. como puedo hacer para usar los caracteres especiales %,= como delimitadores? y a su vez formatear la salida en un ciclo FOR /F. Muchas gracias por la gran ayuda

    ResponderEliminar
    Respuestas
    1. ¿A que caracteres especiales te refieres? ¿al simbolo "%" del tanto por ciento?

      Eliminar
    2. Así es, igualmente al simbolo =

      Eliminar
    3. Lo siento amigo, creo que esos dos caracteres ( % y = ) no se pueden usar como delimitadores en el comando FOR. Lo he probado de varias formas y no he podido hacer que funcione

      Eliminar
  20. Muy buen día profesor, en este momento estoy realizando un fichero que abra un programa ejemplo un bloc de notas, y que al momento que lo cierre el usuario se vuelva abrir, me gustaría un poco de orientación de antemano muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola Jose ART. Es bastante facil lo que me preguntas. Una forma muy sencilla de hacerlo es así:

      @echo off

      notepad
      notepad
      notepad

      Así se te abrirá el Block de Notas 3 veces consecutivas.

      Pero si lo que quieres hacer es que se te abra ese programa muchas veces seguidas tienes que usar un for de la siguiente manera

      @echo off

      REM Se abrira 20 veces seguidas el block de notas
      for /L %%a in (1,1,20) do (
      notepad
      )

      Espero que esto te sirva. Saludos

      Eliminar
    2. O si quieres hacer un bucle infinito sería así:

      @echo off

      REM El numero central que controla el FOR debe ser 0
      for /L %%a in (1,0,2) do (
      notepad
      )

      La clave para que el bucle sea infinito es el 0 que hay entre el 1 y el 2

      Eliminar
  21. Professor
    Boa Tarde,
    Suas informações tem sido muito uteis para mim.
    O Senhor poderia me ajudar com um Bat.
    Preciso somar os valores em um arquivo.dat que contem valores como
    1.234
    234
    4.562
    so consigo somar os valores sem "."

    Obrigado

    ResponderEliminar
    Respuestas
    1. Hola Jorge.

      Supongo que el punto que hay entre los números es el separador de miles. Mira al final de la entrada que voy a poner la solución para el problema que me planteas.

      Los numeros que sumes no pueden ser mayores que el 4.294.967.295, porque serían mayores de 32 bits.

      Espero que te funcione

      Eliminar
    2. Professor Emilio José
      Um solução que encontrei foi de remover os pontos e depois somar.
      O senhor já havia ensinado anteriormente. Usando "!" no lugar de "%"
      Novamente agradeço sua ajuda.

      setlocal enabledelayedexpansion
      FOR /F "tokens=3 delims= " %%i in (soma.dat) do (set soma=%%i
      set var=!soma:.=!
      set /a result= !result! + !var!
      echo !result! )

      Eliminar
  22. Hola Emilio increible articulo, me gustaria preguntarte como puedo hacer un batch para que dentro de una lista de computadoras, por cada computador verifique un archivo como podria ser el archivo hosts y busque si existe la entrada, si no existe que la añada y siga asi con toda la lista de computadores!!
    muchas gracias!

    ResponderEliminar
  23. Hola Emilio, impresionante el articulo pero necesitaría saber como hacer para recorrer el contenido de un directorio y me copie el ultimo fichero modificado, muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola. El comando "dir" nos ofrece varias opciones para visualizar los directorios y archivos de los directorios. Si usas el comando "dir" de la siguiente forma: "dir /o:-d" te aparecerán todos los archivos y directorios ordenados por fecha de modificación, desde el más reciente modificado hasta el que se modificó hace más tiempo.

      Ahora, si quieres ver solamente los archivos (pero no los directorios), tendrás que añadir la opción "/a:-d" al comando "dir", así que si ejecutas lo siguiente:

      dir /o:-d /a:-d

      te aparecerán por pantalla los ficheros del directorio actual ordenados por fecha de modificación (pero no aparecerán en este listado los directorios).

      Pero si solo quieres obtener el nombre de los ficheros (sin la fecha ni el tamaño) tienes que añadir la opción "/b" al comando dir anterior. Con lo cual se nos quedaría así:

      dir /o:-d /a:-d /b

      y ahora tienes que coger el primero de los nombres de ficheros que te aparecen listados, guardarlo en una variable usando un "for" y después usar esa variable para copiar el archivo al directorio destino que quieras.

      Saludos

      Eliminar
    2. Acabo de poner al final del articulo el archivo BAT que haría lo que pides.

      Eliminar
  24. Tengo dos directorios en red mapeados en la PC, U y S, cada una contiene carpetas con el siguiente nombre CAR0001,CAR0002,...CAR0182,CAR0183,... en el U se generan unos archivos que llevan por nombre DP140810.TXT, DP140811.TXT, DP140812.TXT, DP140813.TXT,.... etc, etc. Se generan otros archivos pero lo que me interesan son los .txt.

    Quiero generar un .bat en donde pueda buscar dicho archivo en determinada carpeta que le indique y en ambos directorios, asi como el directorio en que se ubica y que al final si se encuentra en el U que me de la opcion de copiarlo en el S, si ya se encuentra en el S no se hara nada, si no se encuentra en ninguno de los dos arrojar un mensaje.

    Por ejemplo si existe el archivo en el U:

    Carpeta donde buscar: 182
    Archivo a buscar: 140810
    Resultado:
    DP140810.TXT on U

    Copiar aL directorio "S" (Si/No) : S
    New DP140810.TXT on S

    ejemplo Si existe en el S:

    Carpeta donde buscar: 2
    Archivo a buscar: 140811
    Resultado:
    DP010811.txt on S

    Si no existe el archivo:

    Carpeta donde buscar: 183
    Archivo a buscar: 140825
    Resultado: No existe

    Otra opcion donde me permita buscar por fecha en ambos directorios y listar todas las carpetas que no contengan dicho archivo.

    archivo a buscar: 140810
    Resultado:
    CAR0005
    CAR0010
    CAR0026
    CAR0192

    (NOTA: el nombre de la carpeta es CAR0182, pero que me deje buscar en este caso por el 182 sin tener que poner el nombre completo de la carpeta.)

    De antemano muchas por su ayuda.

    ResponderEliminar
  25. Hola profesor!

    Me llamo Fernando y mi pregunta es:

    Cómo puedo hacer que el comando FOR lea un caracter de una variable dentro de un .bat?

    Ejemplo:
    Set caracteres=abcde12345

    For /F "token=%random:~1,1% delims=" %%a in ( Aquí no sé cómo poner la variable ) do (Echo %%a)

    ResponderEliminar
    Respuestas
    1. Hola Fernando, Ya He Respondido A Tu Pregunta Al Final Del Artículo. Echale un Vistazo

      Eliminar
    2. Hola Profe,

      He vuelto a leer lo que escribí hace unos días y me di cuenta que expliqué mal. De todas formas ya encontré la manera de hacer lo que quería.

      Le doy muchas gracias por responderme. Lo que me dice me es útil para mejorar mi Batch. Estoy haciendo un tipo de "matrix" y uso mucho el comando For, por eso pedí su ayuda.

      Le dejo un fragmento de lo que hice por si le interesa:

      REM Linea vertical 1
      :01
      Set caracter="A,a,B,b,C,c,D,d, ,E,e,F,f,G,g,H,h,1,2,3,4,5,6,7,8,9,0, "
      Set azar=%random:~0,2%
      if %azar% GTR 28 Goto 01
      if %azar%==0 Set azar=1
      for /f "tokens=%azar%-31 delims=," %%a in (%caracter%) do (
      Set A=%%a
      )
      ...

      Si se hace un bucle con eso se puede ver más o menos lo que estoy haciendo.

      Saludos y gracias nuevamente!

      Eliminar
  26. Hola Profe, me gustaria saber como se hace un BAT para buscar en un directorio, el archivo más grande los que empiecen con TARRO.D[Fecha] para un determinado mes, ya que hay más de uno, y así poder saber cual debo cargar en mi base.

    ResponderEliminar
  27. Hola Mauricio.

    El comando "dir" nos ofrece varias opciones para visualizar el contenido de los directorios y archivos de los directorios. Si usas el comando "dir" de la siguiente forma: "dir /o:-s" te aparecerán todos los archivos y directorios ordenados por tamaño de modificación, desde el más grande de tamaño hasta el más pequeño.

    Ahora, si quieres ver solamente el listado de los archivos (pero no los directorios), tendrás que añadir la opción "/a:-d" al comando "dir", así que si ejecutas lo siguiente:

    dir /o:-d /a:-d

    te aparecerán por pantalla los ficheros del directorio actual ordenados por fecha de modificación (pero no aparecerán en este listado los directorios).

    Pero si solamente quieres obtener el nombre de los ficheros (sin la fecha ni el tamaño) tienes que añadir la opción "/b" al comando dir anterior. Con lo cual se nos quedaría así:

    dir /o:-s /a:-d /b

    Pero los archivos que buscas empiezan por la cadena de caracteres TARRO.D[fecha]. Supongo que la fecha está en el siguiente formato: "dd-mm-aaaa", entonces tendrás que pedir antes al usuario que te indique el mes correspondiente, con dos digitos. Lo guardas en una variable llamada "mes" y a continuación lo buscas así:

    dir /o:-s /a:-d /b TARRO.D*-%mes%-*

    En cuanto lo ejecutes, te saldrá por pantalla el nombre del archivo más grande del mes que le hayas indicado por teclado.

    ResponderEliminar
  28. Te he dejado al final del articulo el archivo BAT. Espero que te funcione

    ResponderEliminar
  29. Buenas tardes profe, necesitaba crear un archivo para modificar unas lineas de un archivo txt automaticamente , pero resulta que el comando edlin no me funciona y estuve leyendo que este no permite espacios , nose si habrá otra forma de solucionar esto . desde ya muchas gracias


    @echo off

    Set "Archivo=C:\Program Files\Cobian Backup 11\Settings\23245.txt"

    If exist "%Archivo%" (

    (
    echo 1
    echo Gutierrez
    echo w
    echo e
    ) | edlin /b "%Archivo%"

    echo Usuario %username%, COBIAN CORRECTO. PRECIONE ENTER PARA CONTINUAR.
    pause>nul

    )
    else (
    echo Usuario %username%, COBIAN NO ESTA INSTALADO,gracias . PRECIONE ENTER PARA CONTINUAR.
    pause>nul
    )


    desde ya muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola Carlos.

      ¿Has probado a usar "edit" en lugar de "edlin"? Es un editor de archivos de texto.

      Saludos

      Eliminar
    2. si pero con el comando edit uno modifica el archivo, lo que necesito es que se realice automático la edición de las lineas del archivo

      Eliminar
    3. Pues entonces necesitas saber primero qué lineas son las que quieres cambiar (por ejemplo desde la 10 hasta la 15), y luego con un for llegar hasta ellas dentro del fichero y cambiarlas.

      Eliminar
  30. Estimado Emilio,

    Soy Cristian, he creado un BAT con el comando FOR para que me liste los archivos de un directorio en especial en un .txt, pero quisiera que me ayudará para poder tomar también el tamaño de estos archivos, intente realizar en el ejemplo anterior pero es imposible.
    de ante mano, Gracias...

    ResponderEliminar
    Respuestas
    1. Hola Cristian. Para ello tienes que hacer un "FOR /F "tokens=3,4" %%a in ('dir /a:-d tu_directorio')", e ir metiendo el valor de las variables a y b en el archivo de texto, de la siguiente forma: "echo "%%b %%a >> archivo.txt"

      Creo que asi te funcionará. Saludos

      Eliminar
  31. Hola Emilio muy bueno el material.
    Tengo una consulta, como puedo hacer un archivo .bat en donde pueda leer un archivo de texto con varias lineas, mi intención es guardar cada linea en una variable el final de cada linea está representado por el signo = Luego analizar cada linea si extraer ciertos valores si cumple una condición.
    Te agradecería mucho una ayudita.
    Saludos

    ResponderEliminar
    Respuestas
    1. ¿Cómo sería el contenido del archivo? ¿Cada linea tendría igual número de campos o palabras? Ponme un ejemplo del contenido del archivo para poder ayudarte mejor

      Eliminar
    2. por ejemplo esos archivos se presentan asi:

      86134 31965 01706 10304 20243 30011 40096 53006 61254 70500 333 10377 55103=
      86170 32970 01604 10286 20203 39988 40089 53003=
      86185 NIL=
      86192 32970 00000 10282 20183 39895 40109 63204 52004=
      86210 32570 11802 10302 20225 39769 40103 52020 81200 333 10374 55110
      81833=
      86218 31960 01504 10284 20219 30021 40116 53005 70400
      55103=

      En donde una fila completa termina en donde aparezca = ahi veces que una fila es muy larga y aparece en dos renglones.
      Mi idea es recorrer fila por fila por ejemplo ver en la primera fila si existe una columna que comienza con "6"
      Ejemplo: de la primera fila 61254 y extraer valor 125
      cuarta fila: 63204 extraer 320 y asi sucesivamente si cumple la condicion

      Eliminar
    3. Hola Profesor, solo quería preguntarte si es posible hacer lo que estoy pretendiendo.
      Gracias

      Eliminar
    4. Si, se puede hacer. Perdona la tardanza en contestar, pero no he podido hasta ahora. Te pogo el archivo BAT al final del articulo. Espero que te sirva. Saludos

      Eliminar
  32. Hola Emilio necesito guardar la fecha de modificación de un archivo en especifico utilizando archivos de lotes.

    He encontrado esta instrucción en la internet
    FOR %a IN ("archivo Maricela.csv") DO @ECHO %~ta
    y me funciona lo malo es que el valor se muestra en la pantalla y yo lo quiero es que se guarde en una variable

    Encontré una variante de este comando, pero no me ha funcionado
    FOR %%a IN ("archivo Maricela.csv") DO (SET vari=%%~ta ECHO %vari%)
    donde se supone que se guarda el valor, pero realmente esto no ocurre

    ¿Sabes como puedo realizar la tarea mencionada?
    Por cierto yo guardo los archivos como .cmd no se si eso ocasione cambios en la manera en que son procesados.

    ResponderEliminar
    Respuestas
    1. Prueba a poner al principio de tu archivo BAT la linea siguiente:

      setlocal enabledelayedexpansion

      y dentro del for la variable "vari" la tienes que usar así : !vari! , asi que la instrucción del for quedará así:

      FOR %%a IN ("archivo Maricela.csv") DO (SET vari=%%~ta ECHO !vari!)

      Pruebalo y dime si te funciona

      Eliminar
  33. Hola Emilio, felicitaciones por tu labor!!! Te hago una consulta:
    Tengo un archivo.txt que contiene muchas líneas de texto numeradas como sigue:
    000001 texto
    000002 texto
    000004 texto
    Mi problema es que no son todos los números correlativos, como verás falta el 000003, y deseo corregirlo automáticamente dado que son cientos de líneas para revisar. Desde ya Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola. Perdona la tardanza en contestar. Te pongo el archivo bat al final del articulo. Dime si te ha funcionado. Saludos

      Eliminar
  34. Buenas necesito un .bat que me realice lo siguiente: que me mueva los archivos de la carpeta origen a la carpeta destino cuando la fecha de modificaron sea MM-AA (eje 09-2014)

    Ademas necesitaría otro ,bar que mueva de la carpeta origen a la carpeta destino, cuando el nombre del archivo contenga o inicie con "201409..."

    ResponderEliminar
  35. Hola

    Muchas gracias por el materia. Es muy interesante.

    Les escribo para consultar como puedo hacer un .bat que tome uno a uno los archivos que me dejan en un repositorio, moverlos a otra carpeta, dónde debo renombrarlos y ejecutar un DTS para subir los datos a una base de datos y luego moverlos nuevamente a otra carpeta dónde quedaran los ya procesados y renombralo con su nombre original.

    Saludos,


    ResponderEliminar
    Respuestas
    1. El repositorio al que te refieres ¿es una carpeta de tu disco duro?. ¿Que nombre les quieres poner a esos archivos? pon varios ejemplos. ¿Que es un DTS?

      Eliminar
  36. Emilio, queria hacer un bat que copie un archivo de una carpeta a otra pero me vaya mostrando el porcentaje del proceso de copiado o bien una barra de estado o un asterisco rotando, cualquiera que me muestre el estado de la copia
    gracias!!
    pablo.

    ResponderEliminar
    Respuestas
    1. Hola Pablo, siento decirte que eso que pretendes hacer no se cómo hacerlo. Además la ejecución de los comandos es secuencial, es decir uno detrás de otro, entoncesmientras estas copiando un archivo no puedes estar también imprimiendo por pantalla una barra de desplazamiento. O a lo mejor sí se puede hacer, pero yo lo desconozco

      Eliminar
    2. bueno, seguire investigando, gracias!!

      Eliminar
  37. Hola, Muy interesante el trabajo que has hecho.
    He intentado hacer algo facil pero me he liado un poco y por ello te pido ayuda. Tan solo tengo que ir cambiando la version de unos ficheros creados como 'nombre_v1.03' e ir incrementandolos a v1.04..v1.05.. etc Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola, ¿puedes explicar un poco más lo que quieres hacer? Pon algunos ejemplos concretos

      Eliminar
  38. Hola,no se si sepodfra hacer,pero estoy intentando hacer un archivo bat que me iguale el numero de archivos de 2 carpetas. tengo la carpeta 1 con los archivos 001.dwg 002.dwg.... asi hasta el 400.dwg y la carpeta 2 con los archivos 001.pdf 002.pdf... asi hasta 300.pdf por ejemplo. los archivos dwg de la carpeta 1 siempre son 400 y del mismo tipo. y los pdf dela carpeta 2 pueden variar unas veces seran 300 otras 100..... teniendo en cuenta que el nº de archivos dwg tienen que ser igual que los pdf de la carpeta 2 ¿ se podria hacer un archivo bat?

    ResponderEliminar
    Respuestas
    1. A ver si lo entiendo: lo que quieres hacer es que si en la "carpeta2" tienes un archivo llamado "037.pdf", en la "carpeta1" debe haber tambien un archivo llamado "037.dwg" ¿es así?. Y cuando dices que en la carpeta1 debe haber el mismo numero de archivos que en la carpeta2 ¿borras los que te sobren?

      Eliminar
    2. Hola el gran maestro gggirald meha pasado este codigo:

      @echo off
      for /l %%n in (1,1,500) DO (call :Renomb %%n)
      goto :EOF
      :Renomb
      if %1 LSS 10 rename "C:\2\0_00%1.pdf" "00%1.pdf"&goto :EOF
      if %1 LSS 100 rename "C:\2\0_0%1.pdf" "0%1.pdf"&goto :EOF
      rename "C:\2\0_%1.pdf" "%1.pdf"

      que te parece. se puede simplificar.

      Eliminar
  39. HOLA buen día :

    tengo una pregunta, tengo varios archivos donde muestra información como la siguiente :

    COMMAND DISPENSE NOTES.
    05/09/13 16:12:33
    COMMAND DISPENSE NOTES FINISHED.
    05/09/13 16:12:33
    DISPENSER ERROR SENSOR FAILURE OR CURRENCY JAM
    05/09/13 16:12:33
    ERR_HARDWARE_ERROR
    SrvcAddr 20 Class 2 TCode 8 TLen 0 SLen 5 1 0 0 0 0 MCode 2 MStatus 5 MLen 10 1
    8 79 0 0 0 135 0 0 0 RSLen 5 1 1 1 0 1 RCLen 12 0 3 0 0 2 0 0 0 0 0 1 0
    05/09/13 16:13:04
    DISPENSADOR RESET 1 OK
    05/09/13 16:13:04
    RETRY COMMAND DISPENSE NOTES.
    05/09/13 16:13:15
    RETRY COMMAND DISPENSE NOTES FINISHED.
    05/09/13 16:13:16
    COMMAND PRESENT NOTES.
    05/09/13 16:13:19
    BILLETES PRESENTADOS
    05/09/13 16:13:19
    BILLETES RETIRADOS
    05/09/13 16:13:19

    me gustaría un bat que lea todos los archivos y me extraiga desde la cadena DISPENSER ERROR hasta el ultimo digito de RCLen 12 0 3 0 0 2 0 0 0 0 0 1 0 o por lo menos hasta donde inicia el la cadena RCLen

    gracias.

    ResponderEliminar
    Respuestas
    1. Hola. Acabo de crear un BAT que extrae las lineas de un archivo llamado "datos2.txt", desde la linea en la que aparece la cadena de caracteres "DISPENSER ERROR", hasta la linea donde aparece "RCLen". Espero que te sirva. Lo pongo al final del articulo.

      Eliminar
  40. Hola profesor buenos dias, tenco un txt asi:
    CBI; 22; 1; 1; 1; 1;2014/10/08; 1; 1; 1;5140350104 ;D; 333312.00;GMF.4/1000@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; 8600052167;NIT; ; ; ; ; 720; ; ; ; ; ; ; ;
    CBI; 22; 1; 1; 1; 1;2014/10/08; 1; 2; 1;1110050102 ;C; 333312.00;GMF.4/1000@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; 8600052167;NIT; ; ; ; ; 720; ; ; ; ; ; ; ;
    CBI; 22; 1; 1; 1; 1;2014/10/08; 1; 3; 1;1115050105 ;C; 140000000.00;TRASLADO@FONDOS@-@CTA@ORIGEN@@@3114992307@CTA@DESTINO@@@3115; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
    CBI; 22; 1; 1; 1; 1;2014/10/08; 1; 4; 1;1115050113 ;D; 140000000.00;TRASLADO@FONDOS@-@CTA@ORIGEN@@@3114992307@CTA@DESTINO@@@3115; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

    Al ejecutar el siguiente bat:
    @echo off
    Setlocal EnableDelayedExpansion
    SET NOMBRE=%date:~6,4%%date:~3,2%%date:~0,2%
    for /f "tokens=* delims=" %%i in (C:\CAJA-AS400\INTERFAZBW\pibo.txt) do (set c=%%i&echo !c: =! >> piboxyz.txt)

    la salida piboxyz.txt queda ok pero con un blanco al final de cada registro y esto me causa error para la aplicacion que quiero llevarlo:
    CBI;22;1;1;1;1;2014/10/08;1;1;1;5140350104;D;333312.00;GMF.4/1000@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;8600052167;NIT;;;;;720;;;;;;;;
    CBI;22;1;1;1;1;2014/10/08;1;2;1;1110050102;C;333312.00;GMF.4/1000@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;8600052167;NIT;;;;;720;;;;;;;;
    CBI;22;1;1;1;1;2014/10/08;1;3;1;1115050105;C;140000000.00;TRASLADO@FONDOS@-@CTA@ORIGEN@@@3114992307@CTA@DESTINO@@@3115;;;;;;;;;;;;;;;
    CBI;22;1;1;1;1;2014/10/08;1;4;1;1115050113;D;140000000.00;TRASLADO@FONDOS@-@CTA@ORIGEN@@@3114992307@CTA@DESTINO@@@3115;;;;;;;;;;;;;;;
    CBI;22;1;1;1;1;2014/10/08;1;5;1;5140350104;D;1187380.53;GMF.4/1000@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;8909039388;NIT;;;;;720;;;;;;;;
    CBI;22;1;1;1;1;2014/10/08;1;6;1;1115050105;C;1187380.53;GMF.4/1000@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;8909039388;NIT;;;;;720;;;;;;;;

    Muchas gracias por su colaboracion......

    ResponderEliminar
    Respuestas
    1. Si, a mi tambien me ha pasado lo mismo, me pone un caracter blanco al final de cada linea, y no se como solucionarlo. Lo siento

      Eliminar
    2. Hola a todos!

      Estuve leyendo y me interesó ver el por qué salía el caracter vacío al final de cada línea, y pues es muy sensillo.

      Karaoke publico el código:
      "for /f "tokens=* delims=" %%i in (C:\CAJA-AS400\INTERFAZBW\pibo.txt) do (set c=%%i&echo !c: =!"espacio">>"espacio"piboxyz.txt)"

      Como se aprecia el código tiene espacios en blanco innecesarios.
      Si sólo se quisiera leer el resultado estaría bien, pero al momento de trasladarlo a otro programa se cuelan los espacios en blanco.

      Probé el código sin los espacios y en el texto final no queda el caracter blanco molesto.
      "for /f "tokens=* delims=" %%i in (C:\CAJA-AS400\INTERFAZBW\pibo.txt) do (set c=%%i&echo !c: =!>>piboxyz.txt)"

      Espero haya sido ese el problema y si sigue apareciendo tengo otra solución.
      Estoy atento al blog, saludos!

      Atte. Fernando.

      Eliminar
    3. muchas gracias Fernando por tu colaboración

      Eliminar
  41. Hola, quisiera saber como "Crea un fichero por lotes que cuente cuántos ficheros .bmp hay en el disco duro. "

    ResponderEliminar
    Respuestas
    1. Hola, es bastante facil esto que me preguntas.
      Tienes que ejecutar: "dir /S c:\*.bmp | find /c "/" "
      Si quieres lo metes en un archivo bat. Espero que te funcione

      Eliminar
  42. Como podría crea un fichero por lotes al cual se le pase como parámetro un fichero a buscar en la estructura de directorios y muestre un mensaje en caso de encontrarlo.

    ResponderEliminar
    Respuestas
    1. Preguntas el nombre del archivo, lo guardas en la variable "nombre", y despues ejecutas lo siguiente:

      dir /s c:\%nombre%

      esto te mostrara por pantalla todas las veces que se ha encontrado algun archivo con ese nombre dentro de tu unidad C:

      Eliminar
  43. Saludos y buen día tengas, quisiera saber si me puedes ayudar, el asunto es que estoy tratando de buscar un .bat el cual donde busque cierto programa ejecutable .EXE el cual si ya no se esta ejecutando por que lo cerraron y/o se trabo, lo vuelva a arrancar en automático, existe esa posibilidad de crearlo?? muchas gracias por tu atención y tu orientación, saludos

    ResponderEliminar
    Respuestas
    1. Hola Emmanuel. Si se podría hacer lo que me estas planteando. Hay un comando llamado "tasklist" que te permite visualizar los procesos (programas) que hay en ejecución. Solamente tendrías que buscar dentro de esa lista, el programa que estas interesado, y si se encuentra en ella, ya no lo tienes que ejecutar, pero sino, entonces lo ejecutarás.

      Saludos

      Eliminar
    2. @echo off
      set /p nombre="Que programa quieres mantener en ejecucion?: "
      :inicio
      tasklist | find "%nombre%" > nul
      if %errorlevel% equ 1 (
      %nombre%
      )
      goto inicio

      Eliminar
    3. Muchas gracias por su aporte e información, en cuanto pueda lo verifico y si procedo con algún cambio le notificare, de antemano gracias por ampliar mi perspectiva al tema, saludos. (y)

      Eliminar
  44. Hola amigo buenos días. Me gustaría crear un .bat que cuente la cantidad de archivos .rar en el directorio C:\backups. Si el resultado de la cuenta es mayor a 7 (osea, que existen mas de 7 archivos .rar) que escriba en un archivo ubicado en C:\logs la cantidad de archivos encontrados

    ResponderEliminar
  45. Con el siguiente comando obtienes el número de archivos .rar en ese directorio:

    dir c:\backups\*.rar | find /c "/"

    Ahora, si eso lo metes dentro de los parentesis de un for de la siguiente manera:

    for /f %%a in (' dir c:\backups\*.rar ^| find /c "/" ') do (
    if %%a gtr 7 (
    echo Se han encontrado %%a archivos .rar >> c:\logs
    )
    )

    Obendrás lo que estas buscando. Espero que te funcione.

    ResponderEliminar
  46. Hola buenas,

    Tengo una duda que seguramente se resuelva facilmente pero he estado mirando y no he encontrado como hacerlo.

    Tengo una unidad de red con varias carpetas y por ejemplo sólo quiero abrir 3 de esas carpetas.
    Lo he intentado con la opción "explorer" pero no sé como concatenar las rutas para que me las abra en el mismo explorador.
    Esto es lo que estaba poniendo:

    explorer "J:/carpeta1" && "J:/carpeta2"

    Un saludo y gracias.

    ResponderEliminar
    Respuestas
    1. Hola, prueba con esto:

      explorer "j:\carpeta1" ; explorer "j:\carpeta2" ; explorer "j:\carpeta3"

      espero que te funcione. Saludos

      Eliminar
    2. Nada sigue sin funcionar, a ver si a alguien se le ha ocurrido algo.
      Muchas Gracias.

      Eliminar
    3. Hola!

      Perdón que interrumpa, pero quisiera saber a qué se refiere "Anónimo" con "para que me las abra en el mismo explorador". ¿Quieres abrir tres carpetas en una ventana? Porque de ser así es imposible.

      Si lo que deseas hacer es abrir las tres carpetas por separado usando sólo una línea de comando tampoco es posible.

      La única opción que veo viable para lo que pides, siempre y cuando sea lo que necesitas, sería lo siguiente:

      Explorer J:\carpeta1 & Explorer J:\carpeta2 & Explorer J:\carperta3

      (Nótese el slash inverso, como lo puso el profe Emilio, sinó no lo reconocerá como una ruta)

      Esa lína de comando abre las tres carpetas mostrando "carpeta3" de las primera.

      Saludos, espero sirva de algo!
      Atte, Fernando Araneda.

      Eliminar
  47. Hola soy nicolas
    necesito armar un archivo BAT que me copie por primera vez todo el contenido de una carpeta y sub carpetas y al ejecutarlo nuevamente me elimine los archivos que ya no están en la carpeta de origen y sobre escriba los archivos por los mas nuevos
    saludos cordiales

    ResponderEliminar
    Respuestas
    1. Hola Nicolas, en mi caso estoy realizando constantemente
      Respaldo de origen a destino, manteniendo de igual a igual todos los días
      sincronizandolo cada 60min, con la siguiente sintaxis básica:

      @echo off
      Robocopy "Origen" "Destino" /S /Z /R:1 /V /PURGE /MOT:60

      Quizas esto te puede servir, la opción /MOT:60 (equivale a 60 minutos), esto permite monitorear
      cada 60 minutos si hay cambio en el "Origen", una vez cumpliendo el tiempo, replica de forma rapida en el destino.

      Puedes ver más opciones con: Robocopy /?

      Saludos...

      Eliminar
    2. Muchas gracias amigo por colaborar. Es un comando muy interesante el que nos presentas, y mucho más eficiente que varios "copy" y "for".

      Saludos

      Eliminar
  48. Hola

    ya tengo un archivo BAT pero me gustaria saber como subirlo a una pagina web o a facebook.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Comprimelo con WinRAR u otro compresor, y subelo, puesto que si lo subes tal cual es posible que los antivirus de los propios servidores te lo rechacen

      Eliminar
  49. Hola buenos días,

    Muy buenos todos los aportes. Tengo una duda, dispongo de un fichero plano con n registros de la forma siguiente: Username:ROBTR-46319283
    , y lo que quiero es omitir los caracteres html para dejar limpio, ¿ cómo puedo obtenerlo ? he probado diferentes formas pero con ninguna lo consigo, ¿ leer línea a línea y luego carácter a carácter ?
    Gracias por adelantado

    ResponderEliminar
    Respuestas
    1. Al publicarlo se ha perdido el formato del registro "apcUsername:ROBTR-46319283abrs/c

      donde a = <
      donde c = >
      donde s = espacio
      los demás caracteres son los que representan

      Eliminar
    2. Es bastante complicado de hacer con un archivo BAT. Te recomiendo que ese archivo lo abras con Word, copies todo y lo pegues en el Bloc de Notas. Así se te copiará el contenido, pero no las etiquetas html

      Eliminar
  50. Buenas noches,agradezco a aquel que pueda ayudarme con lo siguiente: Necesito un Batch que realice la busqueda y elimine archivos con nombres que empiezan con las letras o simbolos ~$, ejemplo (~$ompesaciones.doc, ~$sobres.xls) que estan alojados por todo mi HDD, que no discrimine si son archivos e office, pdf, jpg, etc.

    Agradezco de antemano la ayuda.

    ResponderEliminar
    Respuestas
    1. el siguiente comando hace lo que tu quieres

      del /S c:\~$*

      Espero que te funcione

      Eliminar
  51. Buenos días estimado, la linea de comando que me indicas es para usar los CMD, como seria para agregarlo a un BATCH que tengo y el cual de a pocos lo estoy personalizando.

    Te comento, tengo un servidor y varias PC donde se a alojado un virus de la variante LNK, este virus oculta información y crea accesos directos de carpetas, también crea copias de archivos (Office, PDF, JPG, etc) y al nombre original del archivo le antepone ~$ estos archivos están por todas partes de mis equipos, luego crea carpetas System Volumen, $RECYCLER.Bin y 360SANDBOX y dentro de ella tiene alojado los archivos con un nombre muy extenso y otro llamado Desktop.ini, también crea archivos autorun.inf., lamentablemente los antivirus (NOD32, AVG, Kaspersky, Avira y Sophos) no lo detectan a menos que el virus cambie a la variante ".exe", la unica forma de quitarlo de los equipos es ubicarlo manualmente y bloqueandolo para que no se reproduzca, luego de ello hay que revisando carpeta por carpeta y eliminarlo, luego hacer visibles todas las carpetas ocultadas por el virus, etc y así es de extenso y tedioso.

    Con el BATCH que tengo se harían todos los procesos mas rápidos, pero me falta agregarle la función que elimine la carpeta RECYCLER y todo lo que contenga y que busque los archivos ~$ y automáticamente los elimine.

    Me gustaría mostrarte el BATCH que tengo y me puedas orientar mejor.

    ResponderEliminar
    Respuestas
    1. Hola Carlos Porras, soy Fernando y quiero explicarte algunas cosas.

      Antes de todo perdir disculpas al profe Emilio si lo que voy a escribir es muy extenso.
      Carlos, quiero aclarar que aunque borres todos los archivos que duplica el virus no vas a erradicarlo. Probablemente el virus que tienes funcione de la siguiente forma:

      -Cuando el virus es abierto en tu pc lo primero que hace es duplicarse a una ubicación random y ocultarse cambiando su extensión y hasta la fecha de creación.

      -En la medida que el virus de desarrola en tu pc pasa por varias fases, y en una de ellas está adherirse al arranque del sistema.

      -Un virus tiene como método de defensa muchas formas de evadir ser eliminado, como por ejemplo duplicado diario a carpetas random y modificacion de regedit, ocultarse en la carpeta recycler (que es donde quedan los archivos que borras en la sesión de windows actual) e iniciarse junto con windows, ocultarse bajo el nombre de algún servicio y/o ejecutable importante del sistema (como svchost o explorer), etc.

      -Algunos virus infectan otros programas que utilizas usualmente.

      Para no hacer tan larga esta respuesta:

      Carlos, te recomiendo que busques ayuda en "forospyware.com". Estuve ayudando en el staff por un tiempo hace algunos años atrás y la gente que trabaja ahí sabe mucho del tema, algunos son profesionales en el tema de seguridad informática.
      Usar un típico altivirus no siempre sirve, a veces se necesita de orientación para no dañar tu software ni mucho menos hardware.

      Espero te ayude de algo, saludos!

      PD: Si por curiosidad aún quieres saber lo del comando para el batch, pues, se agrega tal cual lo publicó el profe Emilio, dentro de tu archivo de lotes.

      " del /S c:\~$* "

      Eliminar
    2. Una explicacion muy buena, Fernando. Muchas gracias por colaborar. Saludos

      Eliminar
  52. hola buenas tardes,

    Como puedo utilizar el resultado del comendo dir /a:h como lista de valores ya que hasta la fecha no obtengo el resultado deseado he tratado con esto
    @echo off
    for %%v in ("dir /a:h") do (
    echo %%v
    )
    pero lo que hace es mostrarme el texto entre comillas. agradeceria de antemano s ayuda

    ResponderEliminar
  53. Buenas tardes , Anónimo.

    Lo que pides es muy fácil:

    Antes de escribir el comando debo decirte que es lo que hiciste mal.
    Usaste el comando For sin extensión, por lo que tu línea de comandos sólo intentaba buscar un archivo llamado "dir /a:h", por lo que no daba respuesta alguna.

    Aquí te dejo el comando completo y algo explicado para que veas la diferencia:

    For /F "tokens=*" %%a in (' Dir /A:h ') Do (
    Echo %%a
    )

    La extensión (o modificador) "/F" te permite usar más funciones, como por ejemplo "tokens" que usé en mi línea. Además te permite ingresar comandos en la búsqueda, pero debes ingresarlos con comilla simple ( ' ).

    Ese es sólo el comando, pero hay un problema, te faltó decir cual es la ruta que quieres scanear. Entonces el comando con ruta incluida sería:

    For /F "tokens=*" %%a in (' Dir /A:h [ruta] ') Do (
    Echo %%a
    )

    Con eso tendrías tu resultado. (para la ruta no uses los corchetes [ ])
    Espero te haya ayudado!
    Saludos, atte. Fernando.

    PD: Si no agregas la ruta no te dará ningún resultado.

    ResponderEliminar
  54. Hola, estoy intentando borrar carpetas de nombres iguales en un equipo.
    Pongo un ejemplo:

    c:\windows\hola
    c:\hola
    c:\documents and settings\hola
    c:\informatica\hola

    Quiero hacer algo para borrar la carpeta hola.

    ResponderEliminar
    Respuestas
    1. Ahí tienes un Bat que hace lo que pides. Espero te sirva.

      PD: Nunca está demás perdir "Por favor" las cosas!

      @Echo off & Cls
      Title Borrando carpetas...

      Choice /C sn /N /M "Preguntar antes de eliminar la carpeta? (S/N): "
      Set Respuesta=%ERRORLEVEL%
      If %Respuesta%==1 Cls & Goto Inicio
      If %Respuesta%==2 Cls & Goto Inicio2

      :Inicio
      Set /P Carpeta=Escriba el nombre de la(s) carpeta(s):
      Echo.

      For /R C:\ /D %%a IN (%Carpeta%*) DO (
      Echo ___________________________________________________________________________
      Echo Eliminando: %%a
      RD /S "%%a"
      Echo ___________________________________________________________________________
      )

      Echo Listo!
      Echo.
      Echo Presione cualquier tecla para empezar de nuevo...
      Pause>nul
      Goto Inicio

      :Inicio2
      Set /P Carpeta=Escriba el nombre de la(s) carpeta(s):
      Echo.

      For /R C:\ /D %%a IN (%Carpeta%*) DO (
      Echo ___________________________________________________________________________
      Echo Eliminando: %%a
      RD /S /Q "%%a"
      Echo ___________________________________________________________________________
      )

      Echo Listo!
      Echo.
      Echo Presione cualquier tecla para empezar de nuevo...
      Pause>nul
      Goto Inicio2

      Eliminar
  55. .buen día profe quisiera recorrer varios archivos después de descomprimirlos y extraer solo de la segunda linea en adelante y concatenarlos en un mismo archivo mi programa va asi:
    @echo off
    echo comienza programa
    cd e:\
    7z x *.zip -oe:\renombrados
    cd renombrados
    for /D %%v in (*) do (
    cd %%v
    )
    cd bitacoras
    ren *.* *.csv

    for /F "skip=1 tokens=*" %%a in ("2014-11-28_2014-11-28_BITACORAS_NAME_8589_ID_51163.csv") do (
    echo %%a >> e:\prueba.txt
    )
    pause
    exit

    el problema que tengo es 1.-no se como indicarle al programa que tiene que recorrer todos los csv, por lo que he indicado el nombre de un archivo en especifico en este caso "2014-11-28_2014-11-28_BITACORAS_NAME_8589_ID_51163.csv", y 2 este fragmento de codigo no funciona en este programa pero si lo corro de manera individual es decir suprimiendo las sentencias de descomprimir y renombrar funciona normalmente, al menos con el archivo que le indico, para concluir la idea es recorrer todos los csv y concatenar todo excepto los encabezados, espero pueda darme alguna idea

    Saludos

    ResponderEliminar
    Respuestas
    1. Espero se entienda algo.
      Escribí en los REM (Comentarios) lo que tienes mal o te falta.

      @Echo off & Cls
      Setlocal EnableDelayedExpansion

      Echo Comienza el programa...

      CD E:\
      REM Creo que asi esta bien el codigo.
      REM No tengo 7z por lo que no tengo como comprobarlo.
      7z X -o:\renombrados *.zip
      REM ------------------------------------------------

      CD renombrados

      REM Que funcion cumple esto aqui??
      REM Esta recorriendo directorios sin hacer nada.
      For /D %%v IN (*) DO (
      CD %%v
      )
      REM -----------------------------

      CD bitacoras

      REM Esta renombrando todos los archivos, pero no le asignas ningun nombre ni formato.
      Ren *.* *.csv
      REM --------------------------------------

      For /R %%a IN (*.csv) DO (
      For /F "Skip=1 Tokens=*" %%b in (%%a) DO (
      Echo %%b >>E:\prueba.txt
      )
      )

      Pause
      Exit

      Lo último lo probé y funciona tal cual lo necesitas.
      Saludos!

      Eliminar
  56. Buenos días y Feliz Año Profesor.
    Necesito un bat que me recorra las unidades del equipo y busque un determinado archivo en la raiz de cada unidad, no necesito que busque en subcarpetas. En cuanto encuentre ese archivo que deje de buscar y me muestre la unidad donde se encuentra el archivo.
    Tengo este bat que me busca un determinado archivo en todas las unidades que elija y me muestra un listado con los archivos encontrados, pero no se como modificarlo para lo que quiero hacer.

    @echo off
    set/p find=Escribe el patron de busqueda de los archivos
    rem Crea un archivo llamado "informe.txt" en el Escritorio del usuario actual
    echo. > %userprofile%\Desktop\Informe.txt

    rem Y ahora recorrera todas las unidades del sistema buscando archivos que
    rem coincidan con el patron
    for %%A IN (D F X) DO (
    if exist %%A:\ (

    rem cambiar la unidad actual y el directorio actual
    cd /D %%A:\

    rem Ahora que ya estoy en la nueva unidad del sistema operativo, busco archivos
    for /R %%E IN (*%find%) DO echo %%E >> %userprofile%\Desktop\Informe.txt

    )
    )
    @pause

    Gracias y buenas fiestas!!

    ResponderEliminar
  57. Buenos dias y Feliz Año Profesor,

    necesito un bat que me recorra un archivo de texto y que me eliminas las dobles comillas que estan de mas dentro de una cadena de texto, por ejemplo tengo filas donde me aparecen valores como """CUENTA DE USUARIO, y quisiera reemplazar esto por "CUENTAS DE USUARIO".

    Gracias de antemano por su apoyo, su blog me ha sido de bastante ayuda

    ResponderEliminar
  58. Buen día Feliz Año profesor

    Soy un poco novato en los BAT, y necesito hacer una tarea que verifique si existen 4 archivos en un directorio, necesito los mas recientes y también verificar si el tamaño es mayor de 1K si alguna de estas condiciones no se cumple notificar mediante un correo.

    De ante mano gracias por sus comentarios, Saludos

    ResponderEliminar
  59. Quiero hacer un fichero .BAT al que le pasemos un fichero de texto y una letra y nos muestre por pantalla todas las palabras que empiecen por esa letra

    ResponderEliminar
  60. Tengo que hacer un programa que busque palabras dentro de un fichero de texto que identifican el nombre de un fichero cada una. También el programa debe comprobar que dicho fichero no existe en cuyo caso lo creará rellenándolo con el texto "Fichero creado correctamente" dentro del mismo y en caso de existir mostrará un mensaje por pantalla avisando al usuario de dicho incidente. El programa generará un fichero ERROR_LOG.TXT con el nombre de cada uno de los ficheros no creados.

    ResponderEliminar
  61. Estimado Profesor,

    Estoy necesitando de su ayuda por favor :) , yo hice este script:

    echo/
    echo Creando Usuarios .......
    for /F "tokens=1,2,3,4,5,6,7 delims=," %%i in (usuarios.txt) do dsadd user "cn=%%j %%i,OU=IT TEST,OU=USUARIOS,DC=dominio,DC=com,DC=ar" -samid %%k -upn %%k@dominio.com.ar -pwd 123456.15 -fn "%%j" -ln "%%i" -display "%%j %%i" -empid "%%l" -mustchpwd yes -desc "I" -title "%%m" -dept "%%n" -company "%%o" -mgr "CN=Usuario Test Manager,OU=IT TEST,OU=USUARIOS,DC=dominio,DC=com,DC=ar"
    echo/
    echo Fin de creacion !

    Basicamente lo que hace es crear multiples usuarias en el AD.

    El problema es que cuando quiero agregar a los usuarios que cree los grupos de los cuales son miembros, uso el comando:

    dsget user "CN=Usuario Test Manager,OU=IT TEST,OU=USUARIOS,DC=dominio,DC=com,DC=ar" -memberof

    Con ese comando obtengo los grupos, pero es un tanto engorroso, ir usuarios por usuario ingresando los grupos de los cuales es miembro, yo de igual manera intente con el parametro, "memberof", en el comando dsadd del FOR, pero tiene una limitacion para agregar mas de 4 grupos, el tema es que por cada usuario, hay alrededor de 30 a 40 grupos.

    Por favor si ud conoce una forma mas dinamica de mejorar este script se lo voy a agradecer, desde ya mil gracias.

    Saludos,

    Francisco

    ResponderEliminar
  62. Estimado Maestro,
    como se podria hacer para copiar un archivo siendo este el mas antiguo de una lista de archivos de una carpeta en una carpeta nueva carpeta.

    ResponderEliminar
    Respuestas
    1. Hola Anónimo!

      Es fácil hacer lo que quieres:

      Usando el comando "Dir" dentro de un "For" te permitirá poder hacer la copia.

      -------------------------------------------------------------------------------------------------
      @Echo off & Cls

      REM Ruta origen (Ruta donde quedará el archivo copiado)
      CD [Ruta donde se encuentra el archivo a copiar]
      Set RutaOrigen=%cd%\

      REM Ruta de destino
      MD "[Ruta de la carpeta destino]\Carpeta Destino"
      Set RutaDestino=[Ruta de la carpeta destino]\Carpeta Destino\Archivo Copiado.txt

      For /F "Tokens=*" %%a IN ('Dir /B /O:D ^| Find "txt"') DO (
      Copy "%RutaOrigen%%%a" "%RutaDestino%"
      Pause>nul
      Exit
      )
      -------------------------------------------------------------------------------------------------

      En "CD" debes poner sin los paréntesis de corchete [ ] la ruta completa de donde está el archivo a ser copiado.
      Ejemplo: CD "C:\Users\(TuUsuario)\Desktop"

      En "MD" debes poner sin los paréntesis de corchete [ ] la ruta y carpeta de destino.
      Ejemplo: MD "C:\Windos\Carpeta de archivos copiados"

      Supuse que el archivo que quieres copiar es un documento de texto, pero si no es extension ".txt" simplemente lo reemplazas en los lugares donde lo haya puesto por la extensión que necesites. Si el archivo no tiene extensión debes borrar el [^| Find "txt"].

      Donde dice "Set RutaDestino=[Ruta de la carpeta destino]\Carpeta Destino\Archivo Copiado.txt" le asigné el nombre "Archivo Copiado.txt" a la copia, lo cual puedes cambiar a lo que quieras.

      Espero te sirva. Saludos!

      Atte. Fernando.

      Eliminar
  63. Profesor buenas noches,

    Tengo varios archivos.txt los cuales contienen una fecha en la línea 12, quisera modificar ese dato por la fecha actual menos 1 día (la fecha del día anterior) el formato de la fecha es (AAAA/MM/DD HH:MM:SS) 2014-09-18T17:49:08.

    El único dato a modificar es el día, ya que el nombre del archivo quiero que quede tal cual, sin modificaciones.


    Agradezco de antemano el apoyo.

    Saludos,
    Erick Q.

    ResponderEliminar
  64. Quiero hacer un bat que abra un archivo agregue despues de la linea 6 dos lineas de texto y guarde los cambios. gracias

    ResponderEliminar
  65. Estimado profesor, tengo una duda con este ejercicio, si alguien me diera la respuesta le estaría agradecido.Un saludo.

    - Crear un fichero BAT que recoja los siguientes parámetros en cualquier orden omitiendo cualquiera de ellos. DATOS [/O] [/U] [/F] [/H] [/S] [/D] [/M]:

    - /O → muestra el nombre del ordenador
    - /U → muestra el nombre del usuario
    - /F → muestra la fecha
    - /H → muestra la hora
    - /S → muestra el sistema operativo
    - /D → muestra el directorio actual
    - /M → muestra el dominio del equipo.

    ResponderEliminar
  66. Estimado profesor, muy bueno el blog y lo que esta haciendo para ayudarnos.
    Le comento estoy necesitando hacer un bat que recorra varios archivos (archivo1, archivo2,archivo3,etc) y que edite cada archivo, le agregue 3 lineas de texto arriba de todo así con todos los archivos, lo he intentado hacer pero automáticamente no me sale si por separado. Le agradezco de antemano.

    ResponderEliminar
    Respuestas
    1. Hola Hernan como va? me podrias pasar como es que lo haces por separado? yo estaba queriendo hacer eso... agregar 2 lineas a un archivo y no me sale... seria despues de una determinada linea pero a lo mejor con tu bat que las agrega al principio me puedo guiar. Muchas gracias y espero que resuelvas tu consulta.

      Eliminar
    2. Hola celina todo bien por suerte, mira de esta forma lo haces por teclado.
      Vos escribís que queres que el archivo contenga en la primer linea, espero que te sirva. Saludos!

      type "file.txt"
      :code
      set /p "principio=principio :"
      if not defined principio (goto:code)
      setlocal enabledelayedexpansion;
      set /a contador=0
      for /f "tokens=*" %%_ in (file.txt) do (
      set /a contador+=1
      set "array[!contador!]=%%_";
      )
      :: Trunca el archivo:
      echo !principio! > "file.txt"
      :: Vuelve el resto de las variables:
      for /l %%_ in (1desde, 1incremento, !contador!hasta) do (
      echo !array[%%_]! >> "file.txt"
      )
      type "file.txt"
      set /p "=";

      Eliminar
    3. gracias hernan! resulta que lo pude hacer pero no me sirve porque me come los tabs que tenia el arhivo y despues no me funciona para lo que lo necesito. hay alguna manera de cuando copas las lineas mantener los espacios de adelante? gracias

      Eliminar
    4. No ahi me mataste! El profesor esta de vacaciones??? jaja

      Eliminar
  67. Hola Hernan. Mira, lo que tienes que hacer es lo siguiente:

    1.- Crea un archivo llamado "lineas.txt" en el cual metas las 3 lineas que quieres introducir al principio de los demás archivos

    2.- Crea un for con el cual recorrer todos los archivos del directorio

    3.- Dentro del for:
    3.1.- Copia el archivo seleccionado por el for en uno llamado "temporal.txt"
    3.2.- ejecuta: type lineas.txt > %%a (Es decir, mete las 3 primeras lineas en
    el archivo seleccionado)
    3.3.- ejecuta: type temporal.txt >> %%a (añadir el contenido del archivo
    temporal.txt al final del archivo seleccionado por el for )
    FIN DEL FOR

    Estos pasos son los que tienes que seguir para hacer lo que me estas preguntando.
    Saludos.

    ResponderEliminar
    Respuestas
    1. Emilio como estas??, estube intentando hacer lo que me estar diciendo y no logro hacerlo andar, y es mas dificil cuando no tengo un IDE que me diga en donde esta el error jaja, si fuese en eclipse tal vez lo hacia andar, pero en un notepad++ se complica, me podras dar una mano con esto???. Mil gracias!

      Eliminar
  68. hola EMILIO ya llevo 1 hora intentado colocar el caracter % en un archivo creado

    if exist "%a%registro.reg" ( del /f /a /q "%a%registro.reg" )
    (ECHO "c:\\WINDOWS\\system32\\cmd.exe /s /k cd /d %1&pause")>registro.reg

    al abrir el archivo registro.reg solo me sale:
    c:\\WINDOWS\\system32\\cmd.exe /s /k cd /d &pause

    sin %1 te agradeceria bastante..

    ResponderEliminar
    Respuestas
    1. Hola Ghost!

      No sé la causante de el problema, pero puedes hacerlo de esta forma para agregar forzadamente el signo porciento:

      Set "b=%%"
      (
      Echo "c:\\WINDOWS\\system32\\cmd.exe /s /k cd /d %b%1 & Pause"
      )>registro.reg

      Espero te funcione, saludos!

      Atte. Fernando.

      Eliminar
    2. Gracias Fernando... me salvaste de hacer lineas de código!.. funciona perfecto..!!

      Eliminar
  69. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  70. Buenas

    Tengo una estructura mas o menos así

    D:\Estructura
    Carpeta1
    2014
    01
    .
    .
    12
    2015
    01
    .
    .12
    .
    .
    .
    .

    CarpetaN
    2010
    01
    .
    .
    12
    .
    .
    2016
    01
    .
    .12

    Puede existir diferentes años, pero no todos los meses, dentro de cada año

    Y me gustaría mover el contenido de las carpetas mes a otra carpeta, por ejemplo D:\EstructuraFinal

    He creado este .bat, aunque de momento, para que me funcione solo para las carpetas de mes 01

    set num=01
    for /R /D %%v in (*) do (
    set dato=%%v
    if "!dato!" == "!num!"
    move !dato! d:\EstructuraFinal
    )

    Pero me dice que: La sintaxis del comando no es correcta, en el if

    Muchas gracias

    Un saludo

    Raúl

    ResponderEliminar
  71. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  72. como puedo borrar el primer carácter de un archivo en nombre.txt que empieza así :
    |Serie
    necesito borrar este signo esta en la columna 1 fila 1 " | "

    ResponderEliminar
  73. Buenas Emilio :
    Estoy intentando hacer un bat o un script que haga lo siguiente:
    buscar carpetas vacias y cambiarle el icono (normalmente naranja cambiarlo a rojo)
    y las carpetas llenas cambiarle el icono (normalmente naranja cambiarlo a verde)
    con el objeto de que cuando habra un directorio "veo" cual esta vacio y lleno mucho mas rapido
    Muchas gracias

    ResponderEliminar
  74. Hola soy Oscar pordrías ayudarme? Necesito hacer un bat que recorra un directorio y elimine archivos viejos, ateriores a dos días. Son archivos .trc.
    Gracias

    ResponderEliminar
  75. 7. La carpeta temp que está dentro de Windows, guarda información temporal. Diseña un script que muestre los directorios o ficheros de esta carpeta según decida al usuario, y que cree un fichero de salida con la siguiente información:
     Fiche ro de información de temporales creado el día a la hora
     Listado de directorios/ficheros
     Número de directorios/ficheros
    Agradeceria una respuesta no se como hacerlo gracias :)

    ResponderEliminar
  76. quisiera hacer una linea de comando para que me borre los archivos con extension js o vbs en un pendrive en todos los directorios

    ResponderEliminar
  77. Hola visitantes de mi blog. Debido al escaso tiempo libre que tengo, no puedo contestar vuestras amables peticiones. De todas formas, con todos los ejemplos y soluciones que hay puestos en esta entrada hasta el momento, os debe ser más que suficiente para poder realizar los archivos batch que necesiteis. Un saludo

    ResponderEliminar
  78. Hola, gracias por los ejemplos, uno me ha servido mucho (el de renombrar archivos en subdirectorios)

    ResponderEliminar
  79. HOLA ESPERO ME PUEDAN AYUDAR

    TENGO EL SIGUIENTE CODIGO

    echo.
    set /p codbar=Codigo de Barras:
    IF NOT "%codbar%" == "" FINDSTR "%codbar%" catalogo.txt >> log_med%date:~0,2%%date:~3,2%%date:~8,2%-%time:~0,2%.%time:~3,2%.%time:~6,2%.txt
    echo.
    type log_med%date:~0,2%%date:~3,2%%date:~8,2%-%time:~0,2%.%time:~3,2%.%time:~6,2%.txt
    echo.
    set/p clave= Ingresa clave:
    echo.
    set/p desc= Ingresa Descripcion:

    EL DETALLE QUE TENGO ESQUE QUIERO QUE MEDIANTE LA PRIMERA BUSQUEDA ME LLENE EN AUTOMATICO DESCRIPCION Y LA CLAVE.

    EL FICHERO catalogo.txt CONTIENE LO SIGUIENTE:
    010.000.2018.00|7501055308675|TELMISARTAN 500 mg
    010.000.2017.00|7501055308674|TELMISARTAN 400 mg
    010.000.2016.00|7501055308673|TELMISARTAN 300 mg

    ESPERO ME PUEDAN ORIENTAR

    ResponderEliminar
    Respuestas
    1. Hola visitantes de mi blog. Debido al escaso tiempo libre que tengo, no puedo contestar vuestras amables peticiones. De todas formas, con todos los ejemplos y soluciones que hay puestos en esta entrada hasta el momento, os debe ser más que suficiente para poder realizar los archivos batch que necesiteis. Un saludo

      Eliminar
  80. HOLA ESPERO ME PUEDAN AYUDAR

    TENGO EL SIGUIENTE CODIGO

    echo.
    set /p codbar=Codigo de Barras:
    IF NOT "%codbar%" == "" FINDSTR "%codbar%" catalogo.txt >> log_med%date:~0,2%%date:~3,2%%date:~8,2%-%time:~0,2%.%time:~3,2%.%time:~6,2%.txt
    echo.
    type log_med%date:~0,2%%date:~3,2%%date:~8,2%-%time:~0,2%.%time:~3,2%.%time:~6,2%.txt
    echo.
    set/p clave= Ingresa clave:
    echo.
    set/p desc= Ingresa Descripcion:

    EL DETALLE QUE TENGO ESQUE QUIERO QUE MEDIANTE LA PRIMERA BUSQUEDA ME LLENE EN AUTOMATICO DESCRIPCION Y LA CLAVE.

    EL FICHERO catalogo.txt CONTIENE LO SIGUIENTE:
    010.000.2018.00|7501055308675|TELMISARTAN 500 mg
    010.000.2017.00|7501055308674|TELMISARTAN 400 mg
    010.000.2016.00|7501055308673|TELMISARTAN 300 mg

    ESPERO ME PUEDAN ORIENTAR

    ResponderEliminar
    Respuestas
    1. Hola visitantes de mi blog. Debido al escaso tiempo libre que tengo, no puedo contestar vuestras amables peticiones. De todas formas, con todos los ejemplos y soluciones que hay puestos en esta entrada hasta el momento, os debe ser más que suficiente para poder realizar los archivos batch que necesiteis. Un saludo

      Eliminar
  81. Hola. estoy queriendo saber si se escriben archivos en un directorio,
    como puedo hacer un bat? tenia pensando que liste todos los archivos y verificar cual es el utlimo. luego de eso preguntar si tiene 1 hora de antiguedad si tene mas de eso enviar un mail. como puedo hacerlo?

    ResponderEliminar
    Respuestas
    1. Hola visitantes de mi blog. Debido al escaso tiempo libre que tengo, no puedo contestar vuestras amables peticiones. De todas formas, con todos los ejemplos y soluciones que hay puestos en esta entrada hasta el momento, os debe ser más que suficiente para poder realizar los archivos batch que necesiteis. Un saludo

      Eliminar
  82. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  83. Saludos por aqui preciso una ayuda con respecto al FOR, utilizando el contador (1,1,10) quiero que me lea lo que escribi e cada uno 10 SET que se generan del contador por medio de FOR y muestre en cada uno de los 10 ECHO las 10 informaciones diferentes que escribi, tengo algo mas o menos asi.

    Mas o menos asi

    FOR /L %%a in (1,1,10) do (
    set /p LINEA=LINEA[%%a]:
    echo %LINEA%
    )
    Pause >null

    MI MISION ES ESTA

    Linea[1]: Mi primera linea 1
    echo Mi primera linea 1
    Linea[2]: Mi segunda linea 2
    echo Mi primera linea 2
    Linea[3]: Mi tercera linea 3
    echo Mi tercera linea 3
    ......
    y asi sucesivamente

    pero me da error de operador y me toma solo el numero de contador :-(

    espero su ayuda agredecidamente estare, un fuerte abrazo.

    ResponderEliminar
    Respuestas
    1. Hola visitantes de mi blog. Debido al escaso tiempo libre que tengo, no puedo contestar vuestras amables peticiones. De todas formas, con todos los ejemplos y soluciones que hay puestos en esta entrada hasta el momento, os debe ser más que suficiente para poder realizar los archivos batch que necesiteis. Un saludo

      Eliminar
  84. Hola consulta, quiero que cada x tiempo se me ejecute un comando.
    en mi caso quiero ejecutar el "net start spooler" cada 10 min. como sería.

    ResponderEliminar
  85. Hola consulta, quiero que cada x tiempo se me ejecute un comando.
    en mi caso quiero ejecutar el "net start spooler" cada 10 min. como sería.

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
  86. Hola Walter. No sé por qué motivo deseas abrir un servicio que inicia automáticamente con el sistema, pero aquí tienes el código que permite realizar dicha función. Saludos! :

    @Echo off & Cls
    :Bucle
    Net start Spooler 2>nul
    >nul Ping -n 600 Localhost & Goto Bucle

    PD: Obviamente no debes cerrar la ventana de consola.

    ResponderEliminar
  87. hola.

    busco un codigo para que se busque y ejecute el archivo mas reciente de una carpeta dentro de mi PC.

    ResponderEliminar
  88. Fidelk:
    Hola saludos a todos,
    Ya empecé a usar mis primeros FOR gracias los ejemplos del profe :D
    Gracias por compartir, y por su tiempo profesor.
    En fin, agradecería mucho si aquí mismo me ayudan a resolver algo que ignoro.

    Desde CMD, lo sgte. crea una lista de carpetas y subcarpetas con ruta incluida
    i:\>for /r /d %h in (*) do (echo %h >>ListaCarpetaRuta.txt)

    Las lineas de la lista vendrían así:
    i:\Carpetota
    i:\Carpetota\Carpeta
    i:\Carpetota\Carpeta\Carpetita

    Lo que no sé es cómo generar otra lista donde sólo se listen las carpetas y subcarpetas (sin rutas y conservando el orden del anterior que FOR), asi:

    Carpetota
    Carpeta
    Carpetita

    De todas maneras muchas gracias a todos y al profe por compartir :D

    PD: Estoy intentando crear un BAT que elimine aquellas aplicaciones cuyo nombre sea igual a la carpeta que lo contiene (i:\Hola\Hola.exe) ....intento crear un quitagusanos :D

    ResponderEliminar
    Respuestas
    1. Hola Fidelk, me gusta mucho la educación y los modales que demuestras pidiendo ayuda con tu mensaje. Intentaré sacar algo de tiempo para ayudarte. Saludos

      Eliminar
  89. Buenas tardes Profesor, mi nombre es Cristian y quisiera consultarle como crear un batch que liste solo los archivos con directorios y subdirectorios, obteniendo ademas la fecha de modificacion del archivo y la extension, de manera de obtener de un disco compartido cada dia los archivos que fueron modificados y creados, lo ideal sera que se autoejecute cada dia a un cierto horario, no he podido lograrlo aun y hay aplicaciones que lo hacen pero no es automatico.
    Si me ayuda con esto le agradece mucho!
    Saludos cordiales
    Cristian

    ResponderEliminar
    Respuestas
    1. Hola Cristian. Al igual que el usuario anterior, se te ven buenos modales al pedir las cosas. Intentaré ayudarte pronto. Saludos

      Eliminar
    2. Hola Cristian y Profesor!

      Sé que el profe está bastante ocupado por lo que quise ayudar un poco con este batch.

      El código es algo extenso por lo que lo he subido a Mega.nz
      Espero no estar cometiendo alguna imprudencia.

      Intenté explicar el código con comentarios dentro del Script.

      No pude hacer todo lo que pedías, pero creo que de todas formas te servirá.

      Link: https://mega.co.nz/#!Edl3QAob!DRlRvr-7IG9s5rvwA4uuxePpSsddBOUcH7l6sEA7QmI

      Espero haya sido de ayuda.

      Saludos! Atte. Fernando.

      Eliminar
  90. Fidelk:
    Buenas profesor Emilio y a todos.
    Lo de mi consulta anterior (1 de mayo de 2015, 1:32) se resuelve agregando ~nx

    ANTES (listar carpetas recursivamente incluyendo rutas)
    i:\>for /r /d %h in (*) do (echo %h >>ListaCarpetaRuta.txt)

    AHORA (listar carpetas recursivamente sin incluir rutas)
    i:\>for /r /d %h in (*) do (echo %~nxh >>ListaCarpetaRuta.txt)

    SOLUCIONADO!!! eso era lo que quería. Igualemte muchas gracias :D

    Ahora se me presentó otro desafío =/ que no sé cómo resolver, resulta que quiero mover un archivo hacia un destino, y si ahi ya existiese otro con el mismo nombre, entonces que lo renombre automáticamente, por ejemplo:

    Mover C:\hola.txt hacia D:\
    Pero si ya existe un archivo con el mismo nombre entonces el bat, al mover el archivo previamente lo renombrará y entonces el archivo movido quedaría así:
    D:\hola_1.txt ó D:\hola_2.txt ó D:\hola_3.txt

    Creo que me hice entender :D
    Muchas gracias profesor ya a todos!!! A ver si alguien me puede ayudar con esta barrera please!
    Volveré a pasar por aquí en otro momento, hasta entonces :D

    ResponderEliminar
  91. Buenas tardes, quisiera ver si me pueden ayudar, estoy intentando crear un .bat para que me genere unas carpetas semanales con un número consecutivo, por ejemplo
    9060_prueba
    9061_prueba
    Se puede hacer??

    Saludos

    ResponderEliminar
  92. Buenas tardes Profesor.
    Tengo un fichero con x número de filas y lo tengo que dividir en ficheros de 10000 filas, el problema es que parece ser que con el SKIP no se puede igualar a una variable. Me puede dar alguna solución. Le paso el código que estoy utilizando
    Gracias de antemano

    REM == OBTENEMOS EL NUMERO DE FILAS DEL FICHERO
    for /f "tokens=*" %%i in ('type %FICHERO% ^| find /v /c "" ^< %FICHERO%') do (set nlin=%%i)
    set /a nlin=%nlin%-1

    REM == MIRAMOS EN CUANTOS FICHEROS TENEMOS QUE DIVIDIR EL ORIGINAL
    set /a numf=%nlin%/10000
    set /a aux=%numf%*10000
    if %nlin% GTR %aux% (set /a numf=%numf%+1)
    if %aux%==0 (set numf=1)


    for /L %%t in (1,1,!numf!) do (
    if %%t == 1 (set linea=1)
    if %%t GTR 1 (set /a linea=10000*%%t)
    call :tratarfich
    )

    :tratarfich
    for /f "SKIP=????? tokens=* " %%x in (%FICHERO%) do (

    if "!nlin!" == "0" goto :fin
    set linea=%%x
    set linea=!linea:"=!
    echo !linea! >> inf_sal%%t_%FECHA%.txt
    set /a nlin=!nlin!-1

    )
    :fin

    ResponderEliminar
    Respuestas
    1. Buenos días profesor

      Al final he conseguido lo que quería, pero si encuentra una forma más elegante genial.
      Dejo el código con la solución y gracias de nuevo
      REM == OBTENEMOS EL NUMERO DE FILAS DEL FICHERO
      for /f "tokens=*" %%i in ('type %FICHERO% ^| find /v /c "" ^< %FICHERO%') do (set nlin=%%i)
      set /a nlin=%nlin%-1

      REM == MIRAMOS EN CUANTOS FICHEROS TENEMOS QUE DIVIDIR EL ORIGINAL
      set /a numf=%nlin%/10000
      set /a aux=%numf%*10000
      if %nlin% GTR %aux% (set /a numf=%numf%+1)
      if %aux%==0 (set numf=1)


      REM === GUARDAMOS EN AUX HATA QUE LINEA QUEREMOS GARDAR EN EL FICHERO
      set /a aux=%numf%*10000
      set /a aux=%aux%-10000
      set /a aux=%aux%+1


      for /f "tokens=* " %%x in (%FICHERO%) do (

      if "!nlin!" == "0" goto :fin
      set linea=%%x
      set linea=!linea:"=!

      echo !linea! >> inf_sal!numf!_%FECHA%.txt

      set /a nlin=!nlin!-1

      REM === SI EL NÚMERO DE LINEAS ES MENOR AL NUMERO DE LINAS QUE QUEREMOS GUARDAR
      REM === EN EL FICHERO, RESTAMOS 1 A LA VARIABLE NUNF PARA GENERAR EL NUEVO FICHERO
      REM === Y VOLVEMOS A CALCULAR EL NÚMERO DE LINEAS PARA EL NUEVO FICHERRO
      REM === LLAMANDO A LA FUNCION :newfich
      if !nlin! LSS !aux! (call :newfich)

      )


      :newfich

      set /a numf=!numf!-1


      set /a aux=%numf%*10000
      set /a aux=%aux%-10000
      set /a aux=%aux%+1

      :fin

      Eliminar
  93. buenas tardes profesor y a todos, necesito ayuda sobre una cuestión que se me plantea:
    tengo un txt con una linea del siguiente formato xxxxxxxxxx12345, lo que he de ir cambiando, previa pregunta del batch, son los cinco últimos números y solo debe dejarme poner números.
    gracias de antemano por su ayuda

    ResponderEliminar
  94. Espectacular
    Me ha servido de gran ayuda.
    Mil gracias

    ResponderEliminar
  95. Buenos dias les pido ayuda para esto, tengo 14 carpetas que son alimentadas por un software que cada una lleva un nombre de 3 Letras y dentro de estas diferente cantidad de archivos no superan los 5000.
    Les dejo un ejemplo de lo que quiero hacer Para la Carpeta que se llama RPC que contiene archivos con la siguiente estructura PRY Nro 0001-00010442.pdf y necesito renombrarlos con la siguiente estructura RPC PRY10442.PDF pero que ademas esta tarea pueda programarla en un horario determinado. Esto es para todas las 14 Carpetas y sus archivos. GRACIAS

    ResponderEliminar
  96. Hola Profesor!

    Le queria consultar como puedo hacer un .bat que lea un .txt y busque varios strings y escriba en otro texto las lineas que contienen esos strings.
    tengo un .txt que tiene por ejemplo
    NOMBRE : PEPE
    EDAD: 23
    Entonces necesito encontrar las lineas que contienen "NOMBRE" y "EDAD"
    y escriba en otro .txt
    NOMBRE:PEPE EDAD:23



    Muchas gracias de antemano
    Saludos cordiales!

    ResponderEliminar
  97. Que tal, mi nombre es Erick y antes que nada me gustaría agradecer el tiempo y esfuerzo que se han tomado (principalmente el Profesor) para escribir esta guia de comandos, he leido los ejemplos aqui expuestos y me parecen bastante utiles (en cuestión de aprendizaje) sin embargo, estoy un tanto "atorado" con una situación en particular, si el amable Profesor (o algún lector con mas conocimiento) fueran tan gentiles de darme algo de orientación lo agradecere sinceramente.

    La situación es la siguiente:

    Tengo aprox. 500 archivos dentro de una carpeta, necesito una solución para crear una carpeta con el nombre de cada uno de los archivos contenidos dentro (sin extensión) y mover cada uno de los archivos dentro de su respectiva carpeta, aqui un ejemplo para intentar explicarme mejor.

    Carpeta Raiz (La llamare Documentos)


    c:\documentos
    |____archivo123.rar
    |____archivoxyz.rar
    |____ficheroabc.doc
    |____documento.pdf
    |____tabla.xls

    Mover cada archivo dentro de una carpeta con su mismo nombre

    c:\documentos
    |____archivo123
    |____archivo123.rar
    |____archivoxyz
    |____archivoxyz.rar
    |____ficheroabc
    |____ficheroabc.doc
    |____documento
    |____documento.pdf
    |____tabla
    |____tabla.xls

    Esto me gustaría se pudiera hacer sin la intervención del usuario, y de ser necesario al agregar mas archivos a la carpeta principal creara las nuevas carpetas y moviera los archivos a sus respectivos destinos.

    Nuevamente agradezco su atención y la ayuda brindada.

    Que pasen una excelente noche.

    ResponderEliminar
    Respuestas
    1. Bueno, pues buscando encontré por fin la solución a mi dilema, aqui esta el código del archivo BAT que crea una carpeta con el nombre de cada archivo contenido en ella y mueve dicho archivo a su respectiva carpeta.

      @echo off
      for %%a in (*.*) do (
      md "%%~na" 2>nul
      move "%%a" "%%~na"
      )

      Espero les sirva, gracias y buenas noches.

      Eliminar
  98. Amigos estoy tratando de hacer un bat que me recorra todas las unidades disponibles en la pc y determinar diferentes archivos para su copia todo dentro de un for. Tengo algunos ejemplos que he encontrado en esta propia página, pero cuando trato de arreglarlo a mi necesidad no me pincha si me pudieran ayudar se los agradecería:::: saludos.
    La idea es algo como esto
    @echo off
    setlocal enabledelayedexpansion
    for %%A IN (A B D E F G C H I J K L M N O P Q R S T U V W X Y Z) DO (
    for %%f in (*.jpg, *.mp3, *.bmp) do (
    xcopy /S /C /Y %%A:\%%f %~dp0
    )
    )
    pause

    ResponderEliminar
  99. Hola quisiera saber si me pueden ayudar necesito hacer un archivo .bat que me respalde archivos de una carpeta a otra y la comprima en .rar, y ya que este respaldada me elimine esa carpeta y solo me deje el archivo .rar. muchas gracias espero me puedan ayudar

    ResponderEliminar
    Respuestas
    1. Ok, este seria el codigo:

      ****************************************

      "%SYSTEMDRIVE%\%PROGRAMFILES%\WinRAR\winrar.exe" a -r %SYSTEMDRIVE%\Respaldo.rar -df C:\Carpeta con Archivos a Respaldar\*.*

      ****************************************
      Te lo explico

      %SYSTEMDRIVE% es la unidad donde se encuentra el sistema (C:, D:, etc.)

      %PROGRAMFILES% es donde se encuentra la carpeta "Archivos de Programa" / "Program Files"

      Winrar a - Es el comando que comprime a un archivo .rar

      el parametro -r - Es para comprimir recursivamente (Incluye los archivos dentro de otras carpetas dentro de la primera)

      %SISTEMDRIVE%\Respaldo.rar - Es el nombre del archivo que se va a crear como respaldo y que se guardara en la raiz de la unidad

      el parametro -df - Elimina los archivos comprimidos al finalizar el respaldo.

      ****************************************

      Puedes cambiar: %SYSTEMDRIVE%\Respaldo.rar por la unidad donde quieras guardar el respaldo y el nombre de archivo que desees

      y DEBES cambiar: C:\Carpeta con Archivos a Respaldar\ por la ruta de la unidad y carpeta donde tienes los archivos a respaldar

      Espero te sirva.

      Eliminar
  100. Buenos días:

    Necesito un bat que me copie un directorio a varios equipos en mi red.
    Lo común a cada equipo que tengo es el nombre del equipo ej. Equipo01, Equipo02.....
    El directorio que necesito copiar está en "C:\Prueba", y debe pegarse en "\\Equipo01\c$\Prueba", "\\Equipo01\c$\Prueba"....................

    Les agradezco la ayuda que me puedan dar.

    ResponderEliminar
    Respuestas
    1. No tengo en este momento acceso a una red, pero si tienes Windows 7, es bastante sencillo utilizando el siguiente codigo:

      robocopy c:\Prueba \\Equipo01\c$\
      robocopy c:\Prueba \\Equipo02\c$\
      robocopy c:\Prueba \\Equipo03\c$\
      robocopy c:\Prueba \\Equipo04 etc...

      El robocopy ya viene instalado por defecto en Windows 7, si tus unidades y permisos de compartición de red estan correctos con ese comando puedes copiarlos facilmente.

      La comillas solo son necesarias si la ruta tiene espacios o nombres de carpeta de mas de 8 caracteres "C:\Archivos a respaldar\*.*" o "C:\CARPETADEPRUEBACONMISARCHIVOS"

      Eliminar
  101. Estimado, Toda la informacion es de mucha ayuda, tengo el siguiente detalle conseguí listar los archivos de las carpetas y subcarpetas lo que necesito adicionar es el tamaño.

    dir /a /b /S /-p /o:gen >c:\users\......\desktop\listado.xls
    start excel c:\users\.....\Desktop\Listado.xls

    ResponderEliminar
    Respuestas
    1. Se que este blog es para resolver y apoyar con soluciones con archivos BAT, pero hay un programita gratuito, fácil de usar y muy completo que se llama FILELIST CREATOR y lo puedes encontrar aqui: http://www.sttmedia.com/filelistcreator, te proporciona una gran cantidad de detalles sobre los archivos, seguro te sacará del apuro.

      No se si sea posible poner links a otros sitios, si no es correcto me disculpo, hasta pronto.

      Eliminar
  102. Estimado, estoy haciendo un archivo batch en el que al escribir en la variable
    "echo este es un mensaje"
    O también
    "cd d:/carpeta"

    Este primer espacio que se escriba realice la separación de 2 variables más, algo así:

    var1= echo y var2= este es un mensaje
    O
    var1= cd y var2= d:/carpeta

    De esa manera, me gustaría separar el contenido q se escribe a bases de 2 variables pero que se separen a base de un espacio (el primero)

    Si le da solución de antemano muchas gracias :')

    Atte: Jordy Valverde

    ResponderEliminar
  103. hola como puedo hacer bat que modifique el nombre de un archivo

    ResponderEliminar
  104. Hola buenas tardes me podrian colaborar como crear un .bat que realice una validacion de un proceso o varios y genere una alarma al usuario

    ResponderEliminar
  105. Buenos días Profesor Emilio Barco tengo un problema que me aqueja ya hace varios días y no le he encontrado solución pues soy nuevo en el tema. Antes de abordar el problema le agradezco infinitamente por la ayuda. Resulta que me han pedido hacer un archivo .bat que me permita automáticamente descargar archivos de un servidor ftp a mi maquina local pero con la condición de que solo copie los archivos que tengan un rango de fecha del el día actual hasta 6 días antes. Gracias por la ayuda.

    ResponderEliminar
  106. Buen día Profesor.
    Necesito un .bat que copie recursivamente el tipo de archivo .pdf por fecha de modificación a una carpeta, tengo una estructura de carpetas donde solo quiero que copie los archivos creados en el día, porque hay carpetas de años anteriores y sería un parto que todos los días copie todos los años y los reemplace, gracias

    ResponderEliminar
  107. Hola,
    Necessito un .bat que lea el nombre de todas las carpetas que tengo en el fichero , y guarde todos los elementos de dentro de cada carpeta con el nombre de la misma.
    Gracias

    ResponderEliminar
    Respuestas
    1. piensa... quieres todo servido...

      Eliminar
  108. Hola Buenas tardes Profesor.
    Estoy buscando una solucion, para extraer de un directorio donde se encunetran N cantidad de archivos .dat la primera linea de cada uno de ellos y exportarlo a un archivo csv teniendo teniendo la relación en un layout de nombre del archivo (.dat) y el contenido de su primera linea.
    Espero me puedan ayudar

    ResponderEliminar
  109. Fidelk:
    Saludos a todos y muy agradecido si me dan una ayudita PLEASE :S

    Hoy descubrí un problema/dificultad al usar el comando FOR
    Si tengo una memoria USB con archivos y carpetas ocultas e intento listarlos (o imprimirlos) mediante un FOR ya sean solo archivos o carpetas recursivamente o no...... RESULTA QUE NO PASA NADA!!!! al parecer el comando FOR no puede encontrar/trabajar con archivos/carpetas ocultos!!!!!!!!!!!!!

    Ayuda!!! que puedo modificar para que la variable del FOR pueda tomar los nombres de dichos elementos ocultos sin importar cual sean sus atributos?


    PD: En el fondo lo que pretendo es desocultar archivos y carpetas (NO SUBCARPETAS) presentes en la raíz de mi USB gggg

    ResponderEliminar
  110. Fidelk:
    Jajjaja :D añado a lo anteriormente mencionado, mi codigo va mas o menos asi:

    for %a in (F:\*) do (attrib -s -h "%a")
    pause
    for /d %c in (F:\*) do (attrib -s -h "%c")
    pause

    PD2: Tambien he tenido problemas con un FOR dentro de otro FOR, pero despues lo comento..... Me esta gustando esto de los comandos BATCH gggg :D

    ResponderEliminar
  111. Buenas tardes

    Muchas gracias por su blog, me podrían ayudar estoy tratando de mover archivos que empieza con diferentes nombres pero a diferentes carpetas, lo único que tienen en común es el comienzo del nombre del archivo, tengo el siguiente comando pero no me funciona
    for %f in (cam11*) do (
    move %f D:\agosto01-05\CAM11
    )

    ResponderEliminar
  112. Hola buenas tardes espero que por favor me puedan ayudar a generar un batch en el cual me enliste con fecha del ultimo acceso y nombre del los archivos .doc? (doc,docx) y lo ingrese en un archivo documento.txt y de igual manera lo de excel

    Atte. y de antemano muchas gracias RSJ

    ResponderEliminar