Autor
|
Tema: Batch: For X do (varios comandos)... No me esta funcionando... (Leído 6,535 veces)
|
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡
Desconectado
Mensajes: 56
|
Hola, que tal: Antes que nada, disculpen la pregunta tan "basica" que hago, que pareciera que no he leido ni buscado nada. El problema radica en lo siguiente: for /L %%x in (#, #, #) do ( comando comando ) Llevo dias y dias buscando, en google, en un buen de paginas. Aqui, en la sección de programacion->scripting, ya me eche casi las 18 pags (con sus links y sus paginas del tema), buscando todo lo relacionado con batch y el comando for, pero no he encontrado la solución . Por otro lado, tengo un poco de conocimiento en javascript, vb, macros en excel, y empece con C. No lo digo como presumiendo, porque no tengo el nivel de conocimiento que tienen aqui, sino que como es posible que teniendo un poco de practica y conocimiento, esté batallando con esto . El primer ejemplo con el que estoy batallando es el siguiente: @echo off cls for /L %%c in (0, 1, 7) do ( color %%c echo hola%%c ) pause > nul cls(digo, este ejemplo puede sonar muy tonto, pero de esta estructura parto para realizar un script que me interesa hacer) Segun yo, en el primer bucle (for), el color es 0, e imprime hola con tal color, no? Luego, el color es 1, e imprime hola con el color correspondiente a color 1, cierto? Pero solo me muestra hola1, hola2, hola3, etc con el mismo color. Por que rayos no me funciona? que estoy haciendo mal? Pongo otro ejemplo, con el mismo problema: @echo off set x=0 for /L %%c in (1, 1, 8) do ( set /a x=%x%+1 echo %x% ) pause > nul clsPrimero x vale 0. Entra al for y x, que vale 0, es igual a 0 + 1, y debería valer ahora 1, mostrando 1 (segun yo). Luego pasa al siguiente bucle (for) (por asi decirlo) y ahora x que vale 1, es igual a 1 + 1, mostrando 2, si me estoy explicando? Pero lo que me muestra son puros ceros. Donde esta el problema? esta mal la estructura? no se puede escribir de esa forma? Igual podría pensar en una solución alternativa, con :menus y demas, pero esa no es la idea. Alguien tiene alguna solución? Gracias Saludos
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Hola, bueno debo confesaro que no lei todo el post, pero aver si te sirve esto : @echo off for /L %%c in (0, 1, 7) do ( ping -n 1 127.0.0.1>nul color %%c echo hola%%c ) pause > nul cls
El problema era la velocidad con la que se ejecutaba. Pongo otro ejemplo, con el mismo problema: @echo off set x=0 for /L %%c in (1, 1, 8) do ( set /a x=%x%+1 echo %x% ) pause > nul clsPrimero x vale 0. Entra al for y x, que vale 0, es igual a 0 + 1, y debería valer ahora 1, mostrando 1 (segun yo). Luego pasa al siguiente bucle (for) (por asi decirlo) y ahora x que vale 1, es igual a 1 + 1, mostrando 2, si me estoy explicando? Pero lo que me muestra son puros ceros. Te muestra puros ceros, por que en ningun momento estas involucrando al for, es decir nunca estas sumando + 1, solo + 0. @echo off set x=0 for /L %%c in (1, 1, 8) do ( set /a x+=1 ) echo %x% pause > nul cls
Mira esta otra forma : @ECHO OFF SET /A I=0 :BUCLE SET /A I+=1 ECHO %I% IF %I%==10 ( GOTO:END ) ELSE ( GOTO:BUCLE ) :END ECHO:VALOR %I% PAUSE > NUL ( EL VALOR SE VA AGREGANDO EN 1 Y CUANDO LLEGA A 10 SALTA A LA ETIQUETA :END Y MUESTRA EL VALOR.
|
|
« Última modificación: 18 Noviembre 2008, 17:13 pm por Leo Gtz. »
|
En línea
|
|
|
|
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡
Desconectado
Mensajes: 56
|
Hola amigo: Te agradezco por tomarte el tiempo de responder Para la solución que me diste con el color, lo mas seguro es que tengas razon en cuanto al tiempo. El unico detalle es que me muestra todos los holas del mismo color, y mi idea es que se muestra cada hola de un color diferente. Ahora, me pareció interesante la opcion que me diste de "ping -n 1 127.0.0.1>nul" Lo he de probar... En @echo off set x=0 for /L %%c in (1, 1, 8) do ( set /a x+=1 ) echo %x% pause > nul clsPara empezar, no sabia que se podía usar x+=1, como en javascript. Buen dato Perdón, pero tambien tiene unos detalles: Sólo me muestra el resultado, y yo lo que quisiera es que se mostrara 1, 2, 3, etc, tal y como se muestra con la tercer solución que me diste. Según yo (quiza este equivocado), con algo de practica que tengo, creo que no esta mal la estructura que escribo en @echo off set x=0 for /L %%c in (1, 1, 8) do ( set /a x=%x%+1 echo %x% ) pause > nul clssolo que no entiendo por qué no funciona. No lo he probado en vb, pero creo que jalaría bien, porque como digo (y otra vez, quiza este equivocado), creo que la estructura, como la escribi, esta correcta, independiente de la forma corta o correcta de x+=#. Por el tercer ejemplo que me das, lo he de leer con mas detenimiento ahora que venga el fin de semana y no me tenga que levantar tempra a trabajar. Me parece una buena opción, y me va a servir de mucho para ir entendiendo las estructuras de la programación batch. Solo que me interesa mucho entender la forma de escribir y como se interpreta el for, de la forma como comento. La idea principal de usarla como la escribo, es que quiero crear un bat que me renombre varios archivos y les ponga como nombre, los numeros, segun el for en el que se encuentre, por ejemplo, 1.jpg, 2.jpg, 3.jpg, y asi, e incluir un if para que al renombrar el 2do archivo, que quedaría nuevamente como 1.jpg, si ya existe, que lo renombre con siguiente numero. Tienes (tienen) otras ideas? No quisiera que me dieran el codigo ya hecho, sino que me ayudaran a entender como trabaja el for en batch. Nuevamente gracias por tu tiempo y tus comentarios Leo Gtz. Saludos a todos
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Creo que nos estamos complicando demasiado, aquí otra forma, le agregue el ping, para hacer un pequeño retardo, y que se viera bien el aumento de numeros : @ECHO OFF FOR /L %%X IN (1,1,8) DO ( PING -N 1 127.0.0.1>NUL ECHO:%%X SET X=%%X ) ECHO:VALOR %X% PAUSE Esto : FOR /L %%I IN (1,1,8) DO ( SET /A X=%%I+1 ECHO:%X% ) La variable X, solo despues del fin es mostrado su valor real, en el FOR no. Usa las alternativas que te he puesto, Saludos.
|
|
|
En línea
|
|
|
|
Baphonet
Desconectado
Mensajes: 25
|
El problema que tienes con el bat del color es que, segun tengo entendido, es que cuando cambias el color lo cambias a todo lo que haya dentro de la consola por eso tus "holas" tendran siempre el color del ultimo numero que introduzcas. Para poder ver uno de cada color podrias ponerlo asi: @echo off cls for /L %%c in (0, 1, 6) do ( color %%c echo hola%%c pause > nul cls ) Saludos
|
|
|
En línea
|
|
|
|
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡
Desconectado
Mensajes: 56
|
Hola, como estan: Primero que nada, una disculpa por no haber regresado durante semana y media, ni siquiera para agradecer su tiempo y sus respuestas , pero el trabajo ha estado muy pesado y no tengo hora de salida. Asi que, agradezco sus respuestas y en tan poco tiempo . En la cuestion del color Baphonet, no lo habia pensado, pero claro que tiene mucha logica. El color se aplica a toda la pantalla o texto. Leo Gtz., me parecen muy buenas tus alternativas, de hecho estoy leyendo todos los tutoriales de batch que posteas, lo que ocurre es que tengo un concepto de como se "debería" usar el for (por ejemplo), y en batch, rompe con ese concepto. Por lo mismo tengo otra duda que quiza aplique lo mismo que me comentas ("La variable, solo despues del fin es mostrado su valor real, en el FOR no."): @echo off set n=0 for %%a in (*.txt) do set /a n+=1 echo %n% pause > nul Solo muestra el valor 7 (que son los 7 archivos de texto que tengo en esa carpeta). No muestra 1, 2, 3, etc. Se aplica lo mismo que me dices, cierto? En: @echo off set n=1 :menu if %n% LEQ 10 ( echo Vale %n% pause > nul set /a n+=1 echo Ahora vale %n% pause > nul goto :menu ) Mi idea es que primero se mostrara "Vale 1" y luego "Ahora vale 2" Pero lo que se muestra es: Vale 1 Ahora vale 1 Vale 2 Ahora vale 2 Siento molestarlos con cosas, para ustedes ya muy sencillas y entendidas, pero aunque me estoy esforzando por aprender, me estoy topando con este lenguaje. Me podrían dar nuevamente alguna idea o alternativa de como sería la estructura correcta para realizar esto Gracias Saludos
|
|
|
En línea
|
|
|
|
Baphonet
Desconectado
Mensajes: 25
|
No hace falta que te disculpes, creo que todo el mundo debe enterder que todos tenemos nuestros problemas y no siempre podemos disponer del tiempo que quisieramos para gastar en este mundillo que tanto nos apasiona. En cuanto a tu codigo no salia como tu querias porque en los if y for las variables locales se calculan al inicio y no se modifican hasta el final de la agrupacion de instrucciones. Al principio la n vale 1 pero no cambia el valor a 2 hasta el final del if, por ello ambas instrucciones echo valen igual. Lo he puesto asi para que funcione aunque seguro que hay mas posibilidades: set n=1 :menu if %n% EQU 10 ( goto :fin ) echo Vale %n% pause > nul set /a n=%n%+1 echo Ahora vale %n% pause > nul goto :menu :fin Saludos
|
|
|
En línea
|
|
|
|
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡
Desconectado
Mensajes: 56
|
Vientos amigo, muchas gracias. Mas o menos me ha caido el 20, de como se estructura en batch. A ver que dudas me surgen ahora (que van a ser muchas seguramente), en los nuevos ejercicios que se me ocurran. Pues aqui seguimos... Un saludo
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Bitcasa, el espacio ilimitado de almacenamiento, ya está funcionando
Noticias
|
wolfbcn
|
0
|
1,798
|
14 Enero 2012, 17:22 pm
por wolfbcn
|
|
|
Prueba con wireshark para comprobar que server ssh esta funcionando
Redes
|
Anonymous250
|
0
|
2,459
|
27 Septiembre 2012, 21:54 pm
por Anonymous250
|
|
|
DBF no está funcionando correctamente.
Programación General
|
pasqual1
|
3
|
2,482
|
25 Agosto 2016, 14:22 pm
por pasqual1
|
|
|
[PROBLEMA] [BATCH] Varios comandos no... ¿Sirven?
Python
|
.:Xx4NG3LxX:.
|
9
|
3,921
|
17 Febrero 2020, 18:23 pm
por .:Xx4NG3LxX:.
|
|
|
Script para ejecutar unos comandos sólo si un programa está funcionando
Scripting
|
rggamero
|
6
|
4,609
|
24 Abril 2020, 22:58 pm
por rggamero
|
|