[AYUDA] [BATCH] Como saber si una variable tiene un caracter especifico.

Iniciado por .:Xx4NG3LxX:., 21 Febrero 2020, 19:59 PM

0 Miembros y 2 Visitantes están viendo este tema.

.:Xx4NG3LxX:.

Hola otra vez. Como mencioné en el título, quisiera saber Como saber si una variable tiene un caracter especifico.

Lo que quiero hacer es algo como...

Código (dos) [Seleccionar]

@echo off

:a
Set /p "num=Introduce un numero decimal > "
if not defined num (goto :a)

::Bien, ahora, lo que quiero saber es; si el numero introducido
::tiene una coma en cualquier parte, muestre un mensaje, sino
::muestra otro mensaje.


Como ven, no tengo ni siquiera una idea de como se podría hacer.

Espero que me puedan ayudar... Gracias!
"Quizá Batch no sea un lenguaje de programación, pero no obstante deja de ser útil. Asi que no anden diciendo «Que ganas de perder el tiempo»"



Serapis

¿Por qué pierdes el tiempo con esto...?.

Aprende un lenguaje 'de verdad'... donde puedas tomar un libro y absorber en una semana tanto o más de lo que hayas aprendido en meses sobre un proceso (me niego a llamarlo lenguaje) de interpretación extremadamente limitado...

A los "lenguajes de procesado de entradas", hay que darle vuelta y vuelta y ya... se necesitan, pero no para perder tiempo en ellos como para querer resolver enrevesadamente cualquier nimiedad que realizado con cualquier lenguaje, dispone de alguna función explícitamente al caso, dada su generalidad y basta una línea de código...

.:Xx4NG3LxX:.

#2
Disculpa. No es perder el mi tiempo, es querer ir más allá de Batch. Pero más que todo es para aprender, sinceramente, hoy me apeteció aprender Python. Busqué, y encontré un muy buen tutorial, lo recomiendo. Sin tener absolutamente nada de conocimiento sobre Python, voy aprendiendo poco a poco y paso a paso, pero por ahora Batch, que ya sé, ni siquiera es un lenguaje como tal, pero lo quiero dominar al 100%

Lo unico que busco es ayuda con relación al tema, porque ya perdí la cuenta de cuanta gente recomienda aprender otros lenguajes "más completos". También he tocado un poco el VBS, pero hasta ahí...

Espero que alguien me ayude con esto... Gracias!
"Quizá Batch no sea un lenguaje de programación, pero no obstante deja de ser útil. Asi que no anden diciendo «Que ganas de perder el tiempo»"



EdePC

Saludos,

- Se me ocurren dos métodos, uno usando Set y comparando variables, y otro usando Find para revisar el %ErrorLevel% que deja para saber si encontró o no.

Código (dos) [Seleccionar]
@Echo Off
:a
Set /P "num=Introduce un n£mero decimal > "
If Not Defined num GoTo :a

Set aux=%num:,=@%
If "%num%" == "%aux%" (
  Echo No hay ,
) Else (
  Echo Si hay ,
)

Pause


Código (dos) [Seleccionar]
@Echo Off
:a
Set /P "num=Introduce un n£mero decimal > "
If Not Defined num GoTo :a

Echo %num% | Find "," >nul
If ErrorLevel 1 (
  Echo No hay ,
) Else (
  Echo Si hay ,
)

Pause

.:Xx4NG3LxX:.

#4
Lo voy a probar. Aunque, si esa era la solución, me sentiré todo un tonto xD. Gracias!

Pues no funcionó... Recontra funcionó xD. Gracias EdePC, una vez más me has ayudado. Te lo agradezco!

¡GRACIAS EdePC!
"Quizá Batch no sea un lenguaje de programación, pero no obstante deja de ser útil. Asi que no anden diciendo «Que ganas de perder el tiempo»"



.:Xx4NG3LxX:.

"Quizá Batch no sea un lenguaje de programación, pero no obstante deja de ser útil. Asi que no anden diciendo «Que ganas de perder el tiempo»"



Serapis

Cita de: .:Xx4NG3LxX:. en 21 Febrero 2020, 23:57 PM
... es querer ir más allá de Batch.
Querer ir más de allá de Batch, es precisamente elegir y saltar a un lenguaje de programación de alto nivel y completo.

Querer ir más allá en Batch... es perder el tiempo, ni más ni menos... pero como es el tuyo, en efecto, nada más que decir....

Creo sin embargo que es bueno que los que se emperran con batch, estén avisados, y no que luego de años 'descubran ' que han perdido un tiempo precioso que podrían haber dedicado a aprender otras cosas... así que espero que no te dés por ofendido, pués lejos de eso es la intención de un mensaje así...

.:Xx4NG3LxX:.

"Quizá Batch no sea un lenguaje de programación, pero no obstante deja de ser útil. Asi que no anden diciendo «Que ganas de perder el tiempo»"



.:Xx4NG3LxX:.

TEMA REABIERTO

¿Se puede hacer con un for?

Disculpen la molestia... (EdePC)
"Quizá Batch no sea un lenguaje de programación, pero no obstante deja de ser útil. Asi que no anden diciendo «Que ganas de perder el tiempo»"



EdePC

- Sip, solo tienes que recorrer cada caracter de tu variable y ver si es una coma. Como en Batch es algo más complicado obtener el número de caracteres de una variable, puede resultar más sencillo recorrer cierta cantidad de caracteres, en este caso 50, luego se comprueba si aún quedan caracteres en la variable para salir del For y no seguir la 50 veces en vano.

-- Y como siempre, cuando se van a manipular variables de entorno dentro de instrucciones agrupadas hay que utilizar EnableDelayedExpansion:

--- GeSHi tiene un bug con !num:~%%a,1! en DOS así que le voy a poner PHP-BRIEF XD
Código (php-brief) [Seleccionar]
@Echo Off
Set /P "num=Introduce un n£mero decimal > "

SetLocal EnableDelayedExpansion
For /L %%a In (0,1,50) Do (
  Set char=!num:~%%a,1!
  If Defined char (
    If "!char!" == "," (
      Echo Si hay ,
      GoTo :continuar
    )
  ) Else (
    Echo No hay ,
    GoTo :continuar
  )
)

:continuar
Pause


- He estado haciendo pruebas con 50000 iteraciones y veo que el FOR tiene un Bug porque demora igual XD, como si no saliera del For.

-- Tampoco es que se vaya a poner tantas iteracciones, no creo que el usuario se ponga a tipear un número cientos de dígitos XD. Esta otra opción no tiene el Bug:

Código (dos) [Seleccionar]
@Echo Off
Set /P "num=Introduce un n£mero decimal > "
Set /A i = 0

:inicio_bucle
Call Set char=%%num:~%i%,1%%
If Defined char (
  If "%char%" == "," (
    Echo Si hay ,
    Goto :fin_bucle
  )
  Set /A i += 1
  Goto :inicio_bucle
) Else (
  Echo No hay ,
  Goto :fin_bucle
)
:fin_bucle

Pause


-- Estoy utilizando Call Set var1=%%var2:~%var3,1%% para que se expandan bien las variables dentro de variables y asi evitarme usar EnableDelayedExpansion.