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:
Pero si lo vamos a usar dentro de un archivo BAT será así:
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:
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:
EJEMPLO2
Si queremos recorrer una lista de archivos de un determinado directorio (solo archivos, no directorios):
y si queremos mover a la papelera de reciclaje algunos archivos con determinadas extensiones:
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:
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":
EJEMPLO4: (parametro /D)
Si lo que me interesa es listar los directorios en vez de los archivos:
Y si lo quiero hacer recursivamente puedo añadir "/R" al comando anterior:
EJEMPLO5: (parametro /L)
Para crear un tipico bucle contador de 1 a 10, saltando de 1 en 1:
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:
EJEMPLO7: (parametro /F)
Recorrer un archivo y mostrar solo la primera palabra de cada linea:
EJEMPLO8: (parametro /F con tokens)
En el siguiente ejemplo nos quedamos con los tokens (palabras) 1, 3 y 5 de cada linea:
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
O si queremos coger la linea completa a partir de la septima palabra:
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:
También se pueden combinar delimitadores y tokens:
- 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:
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):
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):
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
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!
)
Si quiero ver todas las tablas de multiplicar, debo anidar un FOR dentro de otro, y el archivo BAT quedaría así:
todastablas.bat
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
)
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ó:
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
)
* El usuraio IAN ASO preguntó :
"Hola profesor, buenas tardes (México). Acabo de conocer su blog y
encontré material muy interesante, sobre todo, para los códigos batch
que publicó.
Quiero saber si pudiera ayudarme con un script. El proyecto es este:
Necesito
un script que pueda ejecutarlo únicamente en la raíz de una unidad. Si
este detecta que es un directorio o subdirectorio, como por ejemplo,
"Escritoio", que no se ejecute.
De antemano, muchas gracias. Y disculpe si no es en la entrada adecuada para postear mi duda."
SOLUCIÓN:
@echo off
cd > diractu
set /P ruta=<diractu
if %ruta%==c:\ (
echo estoy en el directorio raiz
) else (
echo NO RAIZ
)
del diractu
* El usuario José Castro preguntó:
"Hola buenas tardes espero me puedan colaborar. Necesito leer un archivo txt donde hay 80 mil códigos (uno por línea), adicionalmente tengo un directorio con unos 20 archivos por cada uno de los 80 mil codigos: ejemplos 176861-PLACA.jpg, 176861-KINI.jpg, 176773.png. esto me da 1.600.000 archivos aproximadamente. La idea es leer del archivo donde están los códigos uno por un e ir creando un directorio con ese código, luego buscar todos los archivos que contengan el código y moverlos dentro del directorio que se creo previamente. el objetivo es organizar un directorio que se mo ha vuelto inmanejable por estar todo en su raiz."
SOLUCIÓN:
@echo off
cls
echo ..............ORGANIZADOR DE ARCHIVOS....................
echo =========================================================
set/p nombre=Indica el archivo que contiene el nombre de todos los archivos a organizar:
for /F %%a IN (%nombre%) do (
REM ahora voy recorriendo el archivo linea por linea y compruebo si existe
REM un directorio con ese nombre. Sino existe lo creo
IF not exist %%a (
mkdir %%a
)
REM ahora del directorio actual muevo los archivos que empiecen por ese
REM nombre a su directorio correspondiente
move .\%%a* %%a 2> nul
echo ....Archivos %%a movidos a %%a....
)
echo TRABAJO FINALIZADO....
que grande Emilio, muy útil, gracias por el aporte
ResponderEliminarMe gustaría crear un archivo bat, el cual me mostrara la fecha de creación de un archivo.
ResponderEliminarel resultado debería ser:
La fecha del archivo es: 20/05/2013
¿Sabría alguna orientación para desarrollarlo?
un saludo: nano
Hola Nano, acabo de crear el archivo que me pedías. Lo he metido en la parte final de esta entrada. Saludos
EliminarHola...muy interesante lo que escribis..estoy tratando de hacer lo siguiente pero no lo logro...quizás puedas ayudarme
ResponderEliminarquiero 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! :)
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
EliminarExcelente 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.
ResponderEliminarhttp://solucionok.blogspot.com
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
EliminarBuenas amigo.... tengo esta dudita me puedes ayudar???
ResponderEliminarLo 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...
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í:
Eliminar@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
Hola: me han planteado el siguiente ejercicio y no se como resolverlo:
ResponderEliminarCrea 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
Excelente ayuda muchas gracias
ResponderEliminarGracias amigo Edwin
EliminarHola, 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.
ResponderEliminarUno 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.
Resuelto. Mira las soluciones arriba dentro de la entrada
ResponderEliminarExcelente ayuda. Muchísimas gracias!
EliminarHola,
ResponderEliminarTengo 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
Hola Victor, te lo he solucionado y mejorado. Buscalo al final de la entrada. Saludos
EliminarHola Profesor,
ResponderEliminarnecesito 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
Hola Mario, prueba con el siguiente comando:
Eliminarrmdir /s /q dms*
Dime a ver si te funciona. Saludos
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
ResponderEliminarHola, 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
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarPrimero 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:
ResponderEliminarfor /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
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.
ResponderEliminarPara 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
Funciona 100% bien, muchas gracias amigo
ResponderEliminarEmilio 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.
ResponderEliminarFran
Hola Fran. Supongo que a lo que te refieres con los "indices" del archivo es que cada linea empieza con un numero.
EliminarSi 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.
Mira al final de la entrada, acabo de poner la solucion al problema que me planteas
EliminarEmilio, mil gracias, te agradezco mucho, es justo lo que estaba buscando, mil gracias en serio!!!, Exitos!!!
EliminarSaludos,
Fran
Me alegro de que haya gente educada que de las gracias. Saludos
EliminarMuchas gracias por este artículo.
ResponderEliminarMe alegro de que haya gente educada que de las gracias. Saludos
EliminarMuy buenas Profesor Emilio, aunque publico mi pregunta como anónimo , mi nombre es Ángel.
ResponderEliminarQuisiera 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
Hola Angel. Si, lo que me preguntas si se puede hacer. El archivo BAT lo he puesto al final de esta entrada. Saludos
EliminarHola 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¿A que caracteres especiales te refieres? ¿al simbolo "%" del tanto por ciento?
EliminarAsí es, igualmente al simbolo =
EliminarLo 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
EliminarMuy 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
ResponderEliminarHola Jose ART. Es bastante facil lo que me preguntas. Una forma muy sencilla de hacerlo es así:
Eliminar@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
O si quieres hacer un bucle infinito sería así:
Eliminar@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
Professor
ResponderEliminarBoa 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
Hola Jorge.
EliminarSupongo 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
Professor Emilio José
EliminarUm 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! )
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!!
ResponderEliminarmuchas gracias!
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
ResponderEliminarHola. 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.
EliminarAhora, 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
Acabo de poner al final del articulo el archivo BAT que haría lo que pides.
EliminarTengo 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.
ResponderEliminarQuiero 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.
Hola profesor!
ResponderEliminarMe 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)
Hola Fernando, Ya He Respondido A Tu Pregunta Al Final Del Artículo. Echale un Vistazo
EliminarHola Profe,
EliminarHe 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!
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.
ResponderEliminarHola Mauricio.
ResponderEliminarEl 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.
Te he dejado al final del articulo el archivo BAT. Espero que te funcione
ResponderEliminarBuenas 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
ResponderEliminar@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
Hola Carlos.
Eliminar¿Has probado a usar "edit" en lugar de "edlin"? Es un editor de archivos de texto.
Saludos
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
EliminarPues 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.
EliminarEstimado Emilio,
ResponderEliminarSoy 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...
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"
EliminarCreo que asi te funcionará. Saludos
Hola Emilio muy bueno el material.
ResponderEliminarTengo 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
¿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
Eliminarpor ejemplo esos archivos se presentan asi:
Eliminar86134 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
Hola Profesor, solo quería preguntarte si es posible hacer lo que estoy pretendiendo.
EliminarGracias
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
EliminarHola Emilio necesito guardar la fecha de modificación de un archivo en especifico utilizando archivos de lotes.
ResponderEliminarHe 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.
Prueba a poner al principio de tu archivo BAT la linea siguiente:
Eliminarsetlocal 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
Hola Emilio, felicitaciones por tu labor!!! Te hago una consulta:
ResponderEliminarTengo 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!
Hola. Perdona la tardanza en contestar. Te pongo el archivo bat al final del articulo. Dime si te ha funcionado. Saludos
EliminarBuenas 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)
ResponderEliminarAdemas necesitaría otro ,bar que mueva de la carpeta origen a la carpeta destino, cuando el nombre del archivo contenga o inicie con "201409..."
Hola
ResponderEliminarMuchas 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,
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?
EliminarEmilio, 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
ResponderEliminargracias!!
pablo.
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
Eliminarbueno, seguire investigando, gracias!!
EliminarHola, Muy interesante el trabajo que has hecho.
ResponderEliminarHe 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.
Hola, ¿puedes explicar un poco más lo que quieres hacer? Pon algunos ejemplos concretos
EliminarHola,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?
ResponderEliminarA 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?
EliminarHola el gran maestro gggirald meha pasado este codigo:
Eliminar@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.
HOLA buen día :
ResponderEliminartengo 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.
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.
EliminarHola profesor buenos dias, tenco un txt asi:
ResponderEliminarCBI; 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......
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
EliminarHola a todos!
EliminarEstuve 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.
muchas gracias Fernando por tu colaboración
EliminarHola, quisiera saber como "Crea un fichero por lotes que cuente cuántos ficheros .bmp hay en el disco duro. "
ResponderEliminarHola, es bastante facil esto que me preguntas.
EliminarTienes que ejecutar: "dir /S c:\*.bmp | find /c "/" "
Si quieres lo metes en un archivo bat. Espero que te funcione
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.
ResponderEliminarPreguntas el nombre del archivo, lo guardas en la variable "nombre", y despues ejecutas lo siguiente:
Eliminardir /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:
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
ResponderEliminarHola 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.
EliminarSaludos
@echo off
Eliminarset /p nombre="Que programa quieres mantener en ejecucion?: "
:inicio
tasklist | find "%nombre%" > nul
if %errorlevel% equ 1 (
%nombre%
)
goto inicio
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)
EliminarHola 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
ResponderEliminaraqui debajo te lo pongo
EliminarCon el siguiente comando obtienes el número de archivos .rar en ese directorio:
ResponderEliminardir 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.
Hola buenas,
ResponderEliminarTengo 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.
Hola, prueba con esto:
Eliminarexplorer "j:\carpeta1" ; explorer "j:\carpeta2" ; explorer "j:\carpeta3"
espero que te funcione. Saludos
Nada sigue sin funcionar, a ver si a alguien se le ha ocurrido algo.
EliminarMuchas Gracias.
Hola!
EliminarPerdó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.
Hola soy nicolas
ResponderEliminarnecesito 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
Hola Nicolas, en mi caso estoy realizando constantemente
EliminarRespaldo 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...
Muchas gracias amigo por colaborar. Es un comando muy interesante el que nos presentas, y mucho más eficiente que varios "copy" y "for".
EliminarSaludos
Hola
ResponderEliminarya tengo un archivo BAT pero me gustaria saber como subirlo a una pagina web o a facebook.
Gracias.
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
EliminarHola buenos días,
ResponderEliminarMuy 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
Al publicarlo se ha perdido el formato del registro "apcUsername:ROBTR-46319283abrs/c
Eliminardonde a = <
donde c = >
donde s = espacio
los demás caracteres son los que representan
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
EliminarBuenas 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.
ResponderEliminarAgradezco de antemano la ayuda.
el siguiente comando hace lo que tu quieres
Eliminardel /S c:\~$*
Espero que te funcione
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.
ResponderEliminarTe 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.
Hola Carlos Porras, soy Fernando y quiero explicarte algunas cosas.
EliminarAntes 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:\~$* "
Una explicacion muy buena, Fernando. Muchas gracias por colaborar. Saludos
Eliminarhola buenas tardes,
ResponderEliminarComo 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
Buenas tardes , Anónimo.
ResponderEliminarLo 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.
Hola, estoy intentando borrar carpetas de nombres iguales en un equipo.
ResponderEliminarPongo un ejemplo:
c:\windows\hola
c:\hola
c:\documents and settings\hola
c:\informatica\hola
Quiero hacer algo para borrar la carpeta hola.
Ahí tienes un Bat que hace lo que pides. Espero te sirva.
EliminarPD: 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
.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:
ResponderEliminar@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
Espero se entienda algo.
EliminarEscribí 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!
Buenos días y Feliz Año Profesor.
ResponderEliminarNecesito 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!!
Buenos dias y Feliz Año Profesor,
ResponderEliminarnecesito 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
Buen día Feliz Año profesor
ResponderEliminarSoy 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
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
ResponderEliminarTengo 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.
ResponderEliminarEstimado Profesor,
ResponderEliminarEstoy 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
Estimado Maestro,
ResponderEliminarcomo 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.
Hola Anónimo!
EliminarEs 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.
Profesor buenas noches,
ResponderEliminarTengo 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.
Quiero hacer un bat que abra un archivo agregue despues de la linea 6 dos lineas de texto y guarde los cambios. gracias
ResponderEliminarEstimado profesor, tengo una duda con este ejercicio, si alguien me diera la respuesta le estaría agradecido.Un saludo.
ResponderEliminar- 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.
Estimado profesor, muy bueno el blog y lo que esta haciendo para ayudarnos.
ResponderEliminarLe 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.
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.
EliminarHola celina todo bien por suerte, mira de esta forma lo haces por teclado.
EliminarVos 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 "=";
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
EliminarNo ahi me mataste! El profesor esta de vacaciones??? jaja
EliminarHola Hernan. Mira, lo que tienes que hacer es lo siguiente:
ResponderEliminar1.- 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.
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!
Eliminarhola EMILIO ya llevo 1 hora intentado colocar el caracter % en un archivo creado
ResponderEliminarif 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..
Hola Ghost!
EliminarNo 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.
Gracias Fernando... me salvaste de hacer lineas de código!.. funciona perfecto..!!
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarBuenas
ResponderEliminarTengo 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
Este comentario ha sido eliminado por el autor.
ResponderEliminarcomo puedo borrar el primer carácter de un archivo en nombre.txt que empieza así :
ResponderEliminar|Serie
necesito borrar este signo esta en la columna 1 fila 1 " | "
Buenas Emilio :
ResponderEliminarEstoy 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
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.
ResponderEliminarGracias
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:
ResponderEliminar 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 :)
quisiera hacer una linea de comando para que me borre los archivos con extension js o vbs en un pendrive en todos los directorios
ResponderEliminarHola 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
ResponderEliminarHola, gracias por los ejemplos, uno me ha servido mucho (el de renombrar archivos en subdirectorios)
ResponderEliminarHOLA ESPERO ME PUEDAN AYUDAR
ResponderEliminarTENGO 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
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
EliminarHOLA ESPERO ME PUEDAN AYUDAR
ResponderEliminarTENGO 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
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
EliminarHola. estoy queriendo saber si se escriben archivos en un directorio,
ResponderEliminarcomo 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?
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
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarSaludos 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.
ResponderEliminarMas 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.
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
EliminarHola consulta, quiero que cada x tiempo se me ejecute un comando.
ResponderEliminaren mi caso quiero ejecutar el "net start spooler" cada 10 min. como sería.
Hola consulta, quiero que cada x tiempo se me ejecute un comando.
ResponderEliminaren mi caso quiero ejecutar el "net start spooler" cada 10 min. como sería.
Este comentario ha sido eliminado por el autor.
EliminarHola 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! :
ResponderEliminar@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.
hola.
ResponderEliminarbusco un codigo para que se busque y ejecute el archivo mas reciente de una carpeta dentro de mi PC.
Fidelk:
ResponderEliminarHola 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
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
EliminarBuenas 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.
ResponderEliminarSi me ayuda con esto le agradece mucho!
Saludos cordiales
Cristian
Hola Cristian. Al igual que el usuario anterior, se te ven buenos modales al pedir las cosas. Intentaré ayudarte pronto. Saludos
EliminarHola Cristian y Profesor!
EliminarSé 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.
Fidelk:
ResponderEliminarBuenas 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
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
ResponderEliminar9060_prueba
9061_prueba
Se puede hacer??
Saludos
Buenas tardes Profesor.
ResponderEliminarTengo 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
Buenos días profesor
EliminarAl 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
buenas tardes profesor y a todos, necesito ayuda sobre una cuestión que se me plantea:
ResponderEliminartengo 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
Espectacular
ResponderEliminarMe ha servido de gran ayuda.
Mil gracias
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.
ResponderEliminarLes 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
Hola Profesor!
ResponderEliminarLe 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!
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.
ResponderEliminarLa 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.
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.
Eliminar@echo off
for %%a in (*.*) do (
md "%%~na" 2>nul
move "%%a" "%%~na"
)
Espero les sirva, gracias y buenas noches.
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.
ResponderEliminarLa 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
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
ResponderEliminarOk, este seria el codigo:
Eliminar****************************************
"%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.
Buenos días:
ResponderEliminarNecesito 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.
No tengo en este momento acceso a una red, pero si tienes Windows 7, es bastante sencillo utilizando el siguiente codigo:
Eliminarrobocopy 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"
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.
ResponderEliminardir /a /b /S /-p /o:gen >c:\users\......\desktop\listado.xls
start excel c:\users\.....\Desktop\Listado.xls
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.
EliminarNo se si sea posible poner links a otros sitios, si no es correcto me disculpo, hasta pronto.
Estimado, estoy haciendo un archivo batch en el que al escribir en la variable
ResponderEliminar"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
hola como puedo hacer bat que modifique el nombre de un archivo
ResponderEliminarHola buenas tardes me podrian colaborar como crear un .bat que realice una validacion de un proceso o varios y genere una alarma al usuario
ResponderEliminarBuenos 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.
ResponderEliminarBuen día Profesor.
ResponderEliminarNecesito 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
Hola,
ResponderEliminarNecessito 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
piensa... quieres todo servido...
EliminarHola Buenas tardes Profesor.
ResponderEliminarEstoy 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
Fidelk:
ResponderEliminarSaludos 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
Fidelk:
ResponderEliminarJajjaja :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
Buenas tardes
ResponderEliminarMuchas 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
)
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
ResponderEliminarAtte. y de antemano muchas gracias RSJ