::CarlitoS.dll
::Función que cuenta los carácteres de una variable
@echo off
setlocal enabledelayedexpansion
set /p palabra=Ingrese una palabra con espacios si quiere:
if defined palabra (call :length %palabra: =_%)
if defined %palabra: =_%.length (echo !%palabra: =_%.length!)
pause
goto :eof
:length
if "%*"=="" (goto :eof)
set arg=%*
set word=%*
set word=%word: =_%
set /a cont=0
:loop
if not defined word (goto end)
set word=%word:~1%
set /a cont +=1
goto loop
:end
set %arg: =_%.length=%cont%
goto :eof
if defined? []:! nunca lo vi, puedes explicar un poco el code? pinta interesante
Bueno, creo que carlitos.dll puede explicarlo mejor... pero if defined lo que hace es comprobar el valor de una variable, si la variable tiene algún valor (aunque sea un espacio), devuelve un verdadero, de lo contrario devuelve un falso ;)
Saludos
esto estaba en los ejecicios puestos x SmartGenius no ?
yo tmb los iba ahacer hasta q llegaste y dijiste "los voy a hacer todos"
y perdio la gracia xD
pero sos una maa en batch man
saludos
If defined lo que hace es preguntar si una variable está definida.
Como al principio del code tengo un set /p palabra=Ingrese texto
si le haces un enter sin escribir nada, el cmd hace:
set palabra=
y borra esa variable.
Podría emularse así también: if not "%variable%"=="" pero no queda tan bien porqué si la variable contiene un " al principio el cmd se confunde con el código, y para eso hay que escribir más
call :length %palabra: =_%
significa que le paso un parametro a :length sustituyendo los espacios por _ lo que no significa que el contenido de la variable no pueda tener espacios, pero es para que no me los elimine al pasarlo por parametro. Ejemplo:
palabra=[espacio][espacio]abc
palabra tiene 5 caracteres
y si comienza con espacio y termina con espacio se borran si llamo a una función (función trim :D). Ejemplo:
call :length %palabra%
hace
call :length abc
y pasa solo abc
:length
recibe todos los parametros en variable arg y en variable word
variable word redundantemente reemplaza los espacios por _ (aunque ahora pienso que se podría borrar esa línea porque ya viene con el reemplazo desde arriba) establecemos el cont en 0, y luego vamos eliminando un carácter por ciclo repetitivo, y aumentado el cont en 1, cuando ya no queden más letras, tendremos un set word= y la borramos, cuando word ya no está definida salimos del ciclo, y establecemos una variable con el nombre del parametro.length con el contenido de cont. Ejemplo:
call :length abc
call :length __abc
set __abc.length=%cont%
Luego cuando se sale de :length pregunta
¿está definida __abc.length? si así es imprime dicha variable, esta vez ayudado por setlocal enabledelayedexpansion porque antes lo tenía así:
call echo %%%palabra: =_%.length%%
pero si el contenido de la variable comenzaba con un numero, el cmd se confundia al hacer un %1 y no imprimia bien.
Actualizo el código
::CarlitoS.dll
::Función que cuenta los carácteres de una variable
@echo off
setlocal enabledelayedexpansion
set /p palabra=Ingrese una palabra con espacios si quiere:
if defined palabra (call :length %palabra: =_%)
if defined %palabra: =_%.length (echo !%palabra: =_%.length!)
pause
goto :eof
:length
set arg=%*
if not defined arg (goto :eof)
set word=%arg%
set /a cont=0
:loop
if not defined word (goto end)
set word=%word:~1%
set /a cont +=1
goto loop
:end
set %arg: =_%.length=%cont%
goto :eof
buena explicación
estoy aprendiendo mucho de tus codes
Soluciono un pequeño bug:
al ingresar "" se muestra en pantalla la salida de set
Solución:
::CarlitoS.dll
::Función que cuenta los carácteres de una variable
@echo off
set /p palabra=Ingrese una palabra con espacios si quiere:
if defined palabra (call :length %palabra: =_%)
if defined [%palabra: =_%.length] (call echo %%[%palabra: =_%.length]%%)
pause
goto :eof
:length
set arg=%*
if not defined arg (goto :eof)
set word=%arg%
set /a cont=0
:loop
if not defined word (goto end)
set word=%word:~1%
set /a cont +=1
goto loop
:end
set [%arg: =_%.length]=%cont%
goto :eof
_