Rob van der Woude's Scripting Pages

Get String Length

Count the number of characters in a string.

There are several techniques to get the length of a string.
I will list some of these here, each with their pros and cons.

As always, enclose a string in doublequotes if it contains any "special characters, e.g. space, tab, ampersand, redirect, pipe, percent, exclamation, comma, caret, etc.
In batch-only solutions, strings are limited to a single line only, not much longer than 8000 characters, and no linefeeds or carriage returns (maximum total command line length is 8192).

 

Get String Length
# Code Pros and Cons
1
>%Temp%\~stringlength.tmp ECHO AbcdEfgh
REM SET /A is used to subtract 2, compensating for the
REM carriage return linefeed appended by the ECHO command
FOR %%A IN (%Temp%\~stringlength.tmp) DO (
	SET /A StringLength = %%~zA - 2
)
DEL %Temp%\~stringlength.tmp
ECHO Length of string AbcdEfgh is %StringLength%
  • 👍 Simple, not much code required
  • 👍 Works with strings of up to 8100+ characters
  • 👍 String length hardly affects speed
  • ✋ Embedding doublequotes are included in the count
  • 👎 A temporary file is created, requires cleanup afterwards
2
SETLOCAL ENABLEDELAYEDEXPANSION
SET String=AbcdEfgh
SET Length=0
FOR /L %%A IN (0,1,8100) DO (
    IF NOT "!String:~%%A,1!"=="" (
        SET /A Length = %%A + 1
    )
)
ECHO Length of string AbcdEfgh is %Length%
ENDLOCAL
  • 👍 Simple, not much code required
  • 👍 Works with strings of up to 8100 characters
  • ✋ Embedding doublequotes are included in the count
  • 👎 Slow
3
CALL :StringLength strlen "AbcdEfgh"
ECHO Length of string "AbcdEfgh" is %strlen%
GOTO:EOF

:StringLength
:: Based on code by jeb on StackOverflow.com
:: https://stackoverflow.com/a/5841587
:: Usage: CALL :StringLength resultvarname string
:: string must be doublequoted if it contains spaces
:: or special characters (e.g. ampersand, redirect,
:: pipe, percent, exclamation, comma, caret).
:: Doublequotes are not counted in length.
SETLOCAL ENABLEDELAYEDEXPANSION
SET string=%~2
IF DEFINED string (
    SET L=1
    FOR %%P IN (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) DO (
        IF "!string:~%%P,1!" NEQ "" (
            SET /A L += %%P
            SET string=!string:~%%P!
        )
    )
) ELSE (
    SET L=0
)
(
    ENDLOCAL
    SET %~1=%L%
    GOTO:EOF
)
  • 👍 Works with strings of up to 8100+ characters
  • 👍 Uses successive approximation, much faster than looping through each individual character
  • 👍 String length hardly affects speed
  • ✋ Embedding doublequotes are ignored in the count
  • 👎 A lot of code
4
SET String=AbcdEfgh
FOR /F "usebackq" %%A IN (`pwsh.exe -c "'%String%'.Length"`) DO (
	SET Length=%%A
)
ECHO Length of string "%String%" is %Length%
  • 👍 Simple, not much code required
  • 👍 Works with strings of up to 8000+ characters
  • 👍 Fast
  • 👍 String length hardly affects speed
  • 👎 Embedding (double)quotes may break the command
  • 👎 Requires PowerShell

 


page last modified: 2024-07-23; loaded in 0.0023 seconds