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