Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Hyakutake07 en 14 Septiembre 2013, 18:53 pm



Título: [BATCH] Duda
Publicado por: Hyakutake07 en 14 Septiembre 2013, 18:53 pm
Buenas  todos.
Les explico mi problema dándoos las gracias de antemano.

El caso es que estoy intentando crear un código para añadir a cualquier .bat, el cual haga una función de transición de lo que se muestra en pantalla. Ejemplo:
texto = Hola
 - Lo que quiero conseguir es que se muestre lentamente cada letra (usando ping -n 1 0.0.0.0 >nul) de manera que aparezca una nueva letra cada medio segundo.

Es puramente visual pero me gustaría entender lo que he hecho mal. Aquí les dejo mi intento fracasado.


Código
  1. @echo off
  2. set x=0
  3. set t=Bienvenido
  4. call :trans
  5.  
  6. :trans
  7. cls
  8. if x==10 goto:eof else (
  9. set /a x=%x%+1
  10. set m=%t:~0,x%
  11. echo  %m%
  12. ping -n 2 0.0.0.0 >nul
  13. goto trans
  14. )

Desde luego supongo que tendré varios errores (Estoy empezando), por favor corrijanme.


Título: Re: [BATCH] Duda
Publicado por: Stakewinner00 en 15 Septiembre 2013, 01:02 am
Tenia uno que hacía más o menos lo que quieres.
Es este

Código
  1. @echo off
  2. mode con cols=100
  3. mode con lines=20
  4.  
  5. call:tpwrtr julitoS.dll presenta:
  6. call:sleep 2
  7. echo.
  8. call:tpwrtr el efecto maquina de escribir ...
  9. echo.
  10. echo.
  11. call:tpwrtr OpenBSD es un sistema operativo libre tipo Unix, multiplataforma, basado en 4.4BSD.
  12. call:sleep 3
  13. echo.
  14. call:tpwrtr Es un descendiente de NetBSD, con un foco especial en la seguridad y la criptografia.
  15. echo.
  16.  
  17. pause>nul
  18. goto:eof
  19.  
  20.  
  21. :tpwrtr
  22. set palabra=%*
  23. if not defined palabra (goto:eof)
  24. set palabra=%palabra: =_%
  25. call:length %palabra%
  26. set /a contt=0
  27. :loopt
  28. call :tpwrtr1 %%palabra:~%contt%,1%%
  29. set /a contt +=1
  30. if %contt% leq %tam% (goto:loopt)
  31. goto:eof
  32. :tpwrtr1
  33. set char=%1
  34. if [%char%]==[_] (set char= )
  35. <nul (set /p msg=%char%)
  36. ping -n 1 127.0.0.0 -w 1>nul 2>&1
  37. goto:eof
  38. :length
  39. set argl=%*
  40. if not defined argl (goto :eof)
  41. set wordl=%argl%
  42. set /a contl=0
  43. :loopl
  44. if not defined wordl (goto endl)
  45. set wordl=%wordl:~1%
  46. set /a contl +=1
  47. goto loopl
  48. :endl
  49. set tam=%contl%
  50. goto :eof
  51.  
  52. :sleep
  53. if "%1"=="" (goto :eof)
  54. set /a limit=0
  55. set /a limit=%1
  56. if %limit% LEQ 0 (goto :eof)
  57. set /a cont=0
  58. :time
  59. set mirror1=%time:~-4,1%
  60. :increment
  61. set mirror2=%time:~-4,1%
  62. if not %mirror2%==%mirror1% (goto count)
  63. goto increment
  64. :count
  65. set /a cont +=1
  66. if "%cont%"=="%limit%" (goto :eof)
  67. goto time
  68. goto :eof
  69. exit
  70.  
  71.  
  72.  
  73.  
  74. @echo off
  75. color a
  76. cls
  77. echo 2
  78. PING 1.1.1.1 -n 1 -w 10>NUL
  79. cls
  80. echo 2F
  81. PING 1.1.1.1 -n 1 -w 10>NUL
  82. cls
  83. echo 2Fa
  84. PING 1.1.1.1 -n 1 -w 10>NUL
  85. cls
  86. echo 2Fac
  87. PING 1.1.1.1 -n 1 -w 10>NUL
  88. cls
  89. echo 2Fac3
  90. PING 1.1.1.1 -n 1 -w 10>NUL
  91. cls
  92. echo 2Fac3R
  93. PING 1.1.1.1 -n 1 -w 10>NUL
  94. pause>nul & exit


Título: Re: [BATCH] Duda
Publicado por: MeCraniDOS en 15 Septiembre 2013, 11:57 am
Quizás si creas el tema en el subforo de scripts te ayuda mas gente.

Saludos


Título: Re: [BATCH] Duda
Publicado por: Hyakutake07 en 16 Septiembre 2013, 21:02 pm
Doy las gracias a Stakewinner por el código. Aunque si no fuese pedir mucho te rogaría que me explicases porque no funciona el "set m=%t:~0,x%" (Es decir, porque 
la x no actua como variable) y el tramo de tu código :tpwrtr.

Gracias a MeCraniDOS por el consejo:D


Título: Re: [BATCH] Duda
Publicado por: Pédrin-2 en 16 Septiembre 2013, 22:14 pm
Pido disculpas por la  intromision.
Me lo copio para poder adaptarlo a mis necesidades
Un millon de gracias  Stakewinner00

Un saludo


Título: Re: [BATCH] Duda
Publicado por: Eleкtro en 17 Septiembre 2013, 04:54 am
porque no funciona el "set m=%t:~0,x%" (Es decir, porque  
la x no actua como variable)

Lo primero de todo es que en ese ejemplo estás escribiendo una x literal, no una variable.

Una x:
Código:
x

Una variable:
Código:
%x%

Entonces añadiendo los caracteres que faltan, nos quedaría así la sintaxis:

Código:
%t:~0,%x%%

Pero de todas formas los caracteres "%" de inicio y fin de variable de la variable "%X%" entrarían en conflicto con los caracteres "%" de la otra variable "%T%", y esto es lo que conseguirías:

%t:~0,%x%%

Lo que he marcado en rojo es lo que Batch tomaría como la primera variable, desde el primer caracter "%" hasta el segundo "%",
lo que he resaltado en en verde se tomaría como un string,
y lo que he resaltado en amarillo es lo que se tomaría como otra variable, o en este caso como un escape del operador "%".

Como puedes entender a simple vista eso no podría funcionar jamás porque como resultado se habrán parseado mal los datos, obteniendo más datos y variables de las que en realidad tenemos.

Entonces al intentar realizar el substring (var:~0,1) y al intentar mostrar el resultado con "echo %m%", esto es lo que Batch te mostraría:
Código:
x%

El string (x) y el operador escapado % (%%), eso es lo que Batch ha podido entender.

Es por esa razón que se deben expandir las variables en tiempo de ejecución en lugar de parsearlas,
o en su defecto también podemos usar la recursividad con el comando Call para parsear las variables.

Lee acerca del comando Setlocal EnableDelayedExpansion y su utilización.

Te muestro dos alternativas funcionales:

Código
  1. @Echo OFF
  2. setlocal enabledelayedexpansion
  3. set /A "x=0"
  4. set "t=Bienvenido"
  5. set /a "x+=1"
  6. set "m=!t:~0,%x%!"
  7. echo %m%
  8. Pause&Exit

Código
  1. @Echo OFF
  2. set /A "x=0"
  3. set "t=Bienvenido"
  4. set /a "x+=1"
  5. call set "m=%%t:~0,%x%%%"
  6. echo %m%
  7. Pause&Exit

Saludos.


Título: Re: [BATCH] Duda
Publicado por: Hyakutake07 en 17 Septiembre 2013, 19:39 pm
Muchas gracias EleKtro H@cker! Ya probé anteriormente con el " %t:~0,%x%% " y entendí a la perfección el error (Buena explicación, gracias de nuevo).

Si me pudieses ayudar te pediría un momento para que me explicases esta linea de tu código: call set "m=%%t:~0,%x%%%"  y este evidentemente:  set "m=!t:~0,%x%!"

No se para que sirven los ("") ni tampoco los (!!). Perdona por la ignorancia :P


Título: Re: [BATCH] Duda
Publicado por: Eleкtro en 17 Septiembre 2013, 20:11 pm
Cito:
Lee acerca del comando Setlocal EnableDelayedExpansion y su utilización.

Pon un poco de tu parte, Google it! :P: http://ss64.com/nt/delayedexpansion.html

La explicación del operador "!" la encontrarás en el mismo enlace de arriba, y aquí tienes más explicaciones sobre los ops que comentas:

By Elektro H@cker: Tutorial extendido de aprendizaje Batch
3.7 Memorizar
(http://foro.elhacker.net/scripting/tema_bloqueado_hasta_finalizar_el_tuto_tutorial_extendido_de_aprendizaje_batch-t375135.0.html;msg1797927#msg1797927)

By Elektro H@cker: Tutorial extendido de aprendizaje Batch
4.8 Otros operadores
(http://foro.elhacker.net/scripting/tema_bloqueado_hasta_finalizar_el_tuto_tutorial_extendido_de_aprendizaje_batch-t375135.0.html;msg1797947#msg1797947)

By Elektro H@cker: Tutorial extendido de aprendizaje Batch
6.3 Variables expandidas
(http://foro.elhacker.net/scripting/tema_bloqueado_hasta_finalizar_el_tuto_tutorial_extendido_de_aprendizaje_batch-t375135.0.html;msg1797972#msg1797972)

saludos


Título: Re: [BATCH] Duda
Publicado por: Hyakutake07 en 18 Septiembre 2013, 17:10 pm
Gracias de nuevo por la ayuda. No tengo apenas tiempo pero me lo leeré.


Título: Re: [BATCH] Duda
Publicado por: Hyakutake07 en 18 Septiembre 2013, 17:27 pm
Tus enlaces no funcionan EleKtro H@cker (Solo el primero). Esto es lo que me aparece en los 3 ultimos:

Error en la Base de Datos

Por favor intenta nuevamente. Si esta pantalla aparece nuevamente, notifica del error a un administrador.

 :o


Título: Re: [BATCH] Duda
Publicado por: Eleкtro en 18 Septiembre 2013, 18:40 pm
A mi me funcionan bien los tres, quizás tuviste un problema de conexión con el foro justo en ese momento, intenta de nuevo...

de todas formas no creo que cueste mucho abrir el primer enlace e ir bajando el post hasta los otros 2 puntos que he citado -.-

Saludos!