[Batch] 6 maneras de saber la longitud de una cadena

Iniciado por modubat, 21 Septiembre 2010, 16:34 PM

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

modubat

Saber la longitud de una cadena (length string) es una función que se necesita usar en muchos codes

aqui dejo unas diferentes formas de hallar la longitud que hice hace un tiempo

1. Caracter a caracter hasta que uno no se defina

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGHT "STRING"
ECHO.%LEN%
PAUSE>NUL
EXIT

========================================================================

:: Mide la longitud de una cadena
:: Devuelve errorlevel=1 si no se especifica la cadena

:LENGHT STRING

SETLOCAL ENABLEEXTENSIONS
SET "STRING=%~1"
:: Empieza el contador en 0
IF "%TMPVAR%"=="" SET/A CONT=0
:: Si no se mandan parametros salimos
IF NOT DEFINED STRING ENDLOCAL & EXIT/B 1
::
:: Extracción de caracteres que aumenta en 1
CALL SET "VAR=%%STRING%:~%CONT%,1%%"
::
IF DEFINED VAR (
:: Sumamos el contador y llamamos a la funcion
SET "TMPVAR=$" & SET/A CONT+=1 & CALL %~0 "%STRING%"
) ELSE (
::Declaramos la variable len
CALL SET LEN=%%CONT%%
)
ENDLOCAL & SET "LEN=%LEN%"
EXIT /B

========================================================================



2.Añadir un caracter hasta que sea igual a la palabra

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO %LEN%
PAUSE
EXIT

=========================================================================

:: Devuelve la longitud de una string
:: Si no se define la string devuelve errorlevel=1

:LENGTH STRING

SETLOCAL ENABLEEXTENSIONS
SET "STRING=%~1"
:: Si no se pasan argumentos salimos.
IF NOT DEFINED STRING EXIT/B 1
:: Empieza el contador en 0
IF "%TMPVAR%"=="" SET/A CONT=0
::
CALL SET "VAR=%%STRING:~,%CONT%%%"
IF NOT "%VAR%"=="%STRING%" (

:: Sumamos 1 al contador
SET "TMPVAR=$"
SET/A CONT+=1
:: Llamamos a la funcion
CALL %0 "%~1"

) ELSE (
CALL SET LEN=%%CONT%%
)
ENDLOCAL & SET "LEN=%LEN%"
EXIT/B

=========================================================================


3.Sabiendo el peso de un archivo (%~z)

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO.%LEN%
PAUSE>NUL & EXIT

==============================================================================

:: Mide la longitud de una string
:: Crea en el disco un archivo TMP.DAT que al finalizar su función se borra

:LENGTH STRING
SETLOCAL ENABLEEXTENSIONS
:: Nos posicionamos en tmp
PUSHD "%TMP%"
:: Creamos el archivo que contiene la string
ECHO.%~1> "TMP.DAT"
::
FOR %%? IN ("TMP.DAT") DO (
:: Restamos dos caracteres
IF EXIST %%~? SET/A "LEN=%%~Z?-2"
:: Eliminamos el archivo
DEL /F /Q %%~F?
)
::
POPD
::
(
ENDLOCAL
SET LEN=%LEN%
)
EXIT/B

==============================================================================



4.Con el comando dir

Código (dos) [Seleccionar]
@ECHO OFF
CALL:LENGTH "STRING"
ECHO.%LEN%
PAUSE & EXIT

========================================================================================

:: Mide la longitud de una string
:: Crea en el disco un archivo TMP.DAT que al finalizar su función se borra
:: Devuelve errorlevel=1 si no se especifica la cadena

:LENGTH

SETLOCAL ENABLEEXTENSIONS
:: Nos posicionamos en tmp
PUSHD "%TMP%"
:: Salimos si no se pasan argumentos
IF "%~1"=="" EXIT/B 1
::
:: Creamos el archivo tmp.dat que contiene la string
ECHO.%~1>TMP.DAT
:: Con dir obenemos el peso del archivo
FOR /F "TOKENS=3" %%F IN ('"DIR /A:-D | FIND /I "TMP.DAT""') DO SET "LEN=%%~F"
::RESTAMOS DOS CARACTERES (ASCII 10 Y 13)
SET/A LEN-=2
::
POPD
ENDLOCAL & SET LEN=%LEN%
EXIT/B

========================================================================================



5. Con el comando findstr

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO.%LEN%
PAUSE & EXIT

==============================================================

:: Mide la longitud de una cadena
:: Devuelve errorlevel=1 si no se especifica la cadena

:LENGTH "STRING"

SETLOCAL ENABLEEXTENSIONS
:: Salimos si no se especifican argumentos
IF "%~1"=="" EXIT/B 1
::
:: Podemos usar también el metacaracter $
FOR /F "DELIMS=:" %%F IN (
'"(ECHO.%~1 & ECHO.) | FINDSTR /O ."'
) DO SET/A LEN=%%~F-3
ENDLOCAL & SET "LEN=%LEN%"
EXIT/B

==============================================================



6. Con el comando debug

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO.%LEN%
PAUSE
EXIT

===================================================================================

:: Mide la longitud de una string
:: Crea en el disco dos archivos TMP.BIN y TMP.DAT que se borran al finalizar.
:: Usa el comando debug

:LENGTH STRING

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:: Nos posicionamos en temp
PUSHD "%TEMP%"
:: Creamos el archivo tmp.bin con la string
ECHO.%~1>TMP.BIN
::
:: Cargamos el archivo con debug
(
ECHO.R CX
ECHO.
ECHO.Q
) | DEBUG TMP.BIN >TMP.DAT

:: Con for cogemos el registro CX
FOR /F "TOKENS=2 SKIP=1" %%A IN ('TYPE TMP.DAT ^| SORT') DO SET "VAR=%%A"
:: Quitamos ceros
FOR /L %%A IN (1 1 4) DO IF "!VAR:~0,1!" EQU "0" SET "VAR=!VAR:~1!"
::
:: Restamos 2 caracteres
SET/A VAR-=2
:: Eliminamos archivos creados
FOR %%F IN ("TMP.BIN" "TMP.DAT") DO DEL /Q /F %%~FF
POPD & ENDLOCAL & SET "LEN=%VAR%"
EXIT/B

===================================================================================




saludos :D

xassiz~

Muy curioso, solo había visto el primer método.

Tsurematsu

Realmente es muy curioso, por cierto que tal este codigo basado en el primer metodo.

Es para poder contar los elementos con un separador.



@echo off
cls
call :LENGHT "uno,dos,tres,cuatro,cinco,seis"
echo %LEN%
pause

:LENGHT STRING
SETLOCAL ENABLEEXTENSIONS
SET "STRING=%~1"
:: Empieza el contador en 0
IF "%TMPVAR%"=="" SET/A CONT=1

:: Si no se mandan parametros salimos
IF NOT DEFINED STRING ENDLOCAL & EXIT/B 1

set "res="
for /f "tokens=%CONT% delims=," %%a in (%1) do (
set res=%%a
)
:: Extracción de caracteres que aumenta en 1
CALL SET "VAR=%res%"

IF DEFINED VAR (
IF NOT "%VAR%"=="" SET "TMPVAR=$" & SET/A CONT+=1 & CALL %~0 "%STRING%"
) ELSE (
SET/A CONT-=1
CALL SET LEN=%%CONT%%
)

ENDLOCAL & SET "LEN=%LEN%"
EXIT /B



Espero que a vosotros tambien os ayude.  :P