texto programacion por linea leer buscar batch bat archivo string batch-file character counting

string - programacion - ¿Cómo contar los caracteres en una cadena con Batch?



batch buscar texto en archivo (2)

Necesito contar los caracteres de una cadena invocada en Batch. No quiero usar archivos temporales. ¿Podría hacerse sin ellos? Si es así, las explicaciones de su código serán muy apreciadas. ¡Gracias!


Cuando llame a la función, el segundo parámetro debe ser un valor en lugar de una referencia:

call :Stringlength result %myVar%


Una forma simple es usar una función

@echo off set "myVar=abcdefg" call :Stringlength result myVar echo %result% exit /b :Stringlength <resultVar> <stringVar> ( setlocal EnableDelayedExpansion set "s=!%~2!#" set "len=0" for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do ( if "!s:~%%P,1!" NEQ "" ( set /a "len+=%%P" set "s=!s:~%%P!" ) ) ) ( endlocal set "%~1=%len%" exit /b )

Esto puede medir la cadena a un máximo de 8192 caracteres, ya que el tamaño máximo de una cadena es 8191 bytes, esto debería ser suficiente.
Los primeros bloques de paréntesis son solo para un poco más de rendimiento.
El segundo bloque es necesario para devolver el valor %len% detrás de la barrera endlocal.
La idea principal es una búsqueda binaria, en el primer ciclo se prueba la copia temporal en s de la cadena si es más larga que 4096 bytes o no.
Entonces la próxima prueba será con 2048 o 6144 (= 2048 + 4096), por lo que la variable len será en cada ciclo un poco más exacta.
Después de 13 bucles, el len es exacto.

Para funciones de strlen más rápidas puedes leer strlen boosted , que usa algunos trucos más.

También existe una solución con macros por lotes, las macros normalmente son mucho más rápidas que las funciones en lote.

@echo off call :loadMacros set "myVar=abcdefg" %$strlen% result myVar echo %result% exit /b :loadMacros set LF=^ ::Above 2 blank lines are required - do not remove set ^"/n=^^^%LF%%LF%^%LF%%LF%^^" :::: StrLen pResult pString set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%/n% for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%/n% set "str=A!%%~2!"%/n% set "len=0"%/n% for /l %%A in (12,-1,0) do (%/n% set /a "len|=1<<%%A"%/n% for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%/n% )%/n% for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%/n% ) %/n% ) ELSE setlocal enableDelayedExpansion ^& set argv=, exit /b

En dostips.com hay algunas discusiones sobre la macro técnica
1 Batch "macros" con argumentos
2 macros con parámetros adjuntos