[BATCH] Duda

Iniciado por Hyakutake07, 14 Septiembre 2013, 18:53 PM

0 Miembros y 1 Visitante están viendo este tema.

Hyakutake07

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 (dos) [Seleccionar]
@echo off
set x=0
set t=Bienvenido
call :trans
exit

:trans
cls
if x==10 goto:eof else (
set /a x=%x%+1
set m=%t:~0,x%
echo  %m%
ping -n 2 0.0.0.0 >nul
goto trans
)


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

Stakewinner00

Tenia uno que hacía más o menos lo que quieres.
Es este

Código (bash) [Seleccionar]
@echo off
mode con cols=100
mode con lines=20

call:tpwrtr julitoS.dll presenta:
call:sleep 2
echo.
call:tpwrtr el efecto maquina de escribir ...
echo.
echo.
call:tpwrtr OpenBSD es un sistema operativo libre tipo Unix, multiplataforma, basado en 4.4BSD.
call:sleep 3
echo.
call:tpwrtr Es un descendiente de NetBSD, con un foco especial en la seguridad y la criptografia.
echo.

pause>nul
goto:eof


:tpwrtr
set palabra=%*
if not defined palabra (goto:eof)
set palabra=%palabra: =_%
call:length %palabra%
set /a contt=0
:loopt
call :tpwrtr1 %%palabra:~%contt%,1%%
set /a contt +=1
if %contt% leq %tam% (goto:loopt)
goto:eof
:tpwrtr1
set char=%1
if [%char%]==[_] (set char= )
<nul (set /p msg=%char%)
ping -n 1 127.0.0.0 -w 1>nul 2>&1
goto:eof
:length
set argl=%*
if not defined argl (goto :eof)
set wordl=%argl%
set /a contl=0
:loopl
if not defined wordl (goto endl)
set wordl=%wordl:~1%
set /a contl +=1
goto loopl
:endl
set tam=%contl%
goto :eof

:sleep
if "%1"=="" (goto :eof)
set /a limit=0
set /a limit=%1
if %limit% LEQ 0 (goto :eof)
set /a cont=0
:time
set mirror1=%time:~-4,1%
:increment
set mirror2=%time:~-4,1%
if not %mirror2%==%mirror1% (goto count)
goto increment
:count
set /a cont +=1
if "%cont%"=="%limit%" (goto :eof)
goto time
goto :eof
exit




@echo off
color a
cls
echo 2
PING 1.1.1.1 -n 1 -w 10>NUL
cls
echo 2F
PING 1.1.1.1 -n 1 -w 10>NUL
cls
echo 2Fa
PING 1.1.1.1 -n 1 -w 10>NUL
cls
echo 2Fac
PING 1.1.1.1 -n 1 -w 10>NUL
cls
echo 2Fac3
PING 1.1.1.1 -n 1 -w 10>NUL
cls
echo 2Fac3R
PING 1.1.1.1 -n 1 -w 10>NUL
pause>nul & exit

MeCraniDOS

Quizás si creas el tema en el subforo de scripts te ayuda mas gente.

Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Hyakutake07

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

Pédrin-2

Pido disculpas por la  intromision.
Me lo copio para poder adaptarlo a mis necesidades
Un millon de gracias  Stakewinner00

Un saludo
Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

Eleкtro

#5
Cita de: Hyakutake07 en 16 Septiembre 2013, 21:02 PMporque 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:
x

Una variable:
%x%

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

%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:
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 (dos) [Seleccionar]
@Echo OFF
setlocal enabledelayedexpansion
set /A "x=0"
set "t=Bienvenido"
set /a "x+=1"
set "m=!t:~0,%x%!"
echo %m%
Pause&Exit


Código (dos) [Seleccionar]
@Echo OFF
set /A "x=0"
set "t=Bienvenido"
set /a "x+=1"
call set "m=%%t:~0,%x%%%"
echo %m%
Pause&Exit


Saludos.








Hyakutake07

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

Eleкtro

#7
Cito:
Cita de: EleKtro H@cker en 17 Septiembre 2013, 04:54 AMLee 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


By Elektro H@cker: Tutorial extendido de aprendizaje Batch
4.8 Otros operadores


By Elektro H@cker: Tutorial extendido de aprendizaje Batch
6.3 Variables expandidas


saludos








Hyakutake07

Gracias de nuevo por la ayuda. No tengo apenas tiempo pero me lo leeré.

Hyakutake07

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