75 votes

Comment obtenez-vous la longueur de la chaîne dans un fichier batch?

Il ne semble pas y avoir de moyen facile d’obtenir la longueur d’une chaîne dans un fichier batch. Par exemple,

 SET MY_STRING=abcdefg
SET /A MY_STRING_LEN=???
 

Comment pourrais-je trouver la longueur de chaîne de MY_STRING ?

Points bonus si la fonction de longueur de chaîne gère tous les caractères possibles dans les chaînes, y compris les caractères d'échappement, comme ceci: !%^^()^! .

95voto

jeb Points 26035

Comme il n’existe pas de fonction de génération pour la longueur de chaîne, vous pouvez écrire votre propre fonction.

 @echo off
setlocal
set "myString=abcdef!%%^^()^!"
call :strlen result myString
echo %result%
goto :eof

:strlen <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
)
 

Cette fonction nécessite toujours 13 boucles, au lieu d'une simple fonction strlen qui nécessite des boucles de strlen.
Il gère tous les personnages.

37voto

Joshua Honig Points 5382

Vous pouvez le faire en deux lignes dans un fichier de commandes, par écrit la chaîne dans un fichier, puis obtenir la longueur du fichier. Vous avez juste à soustraire deux octets pour tenir compte de l'automatique CR+LF ajouté à la fin.

Disons que votre chaîne est dans une variable nommée strvar:

ECHO %strvar%> tempfile.txt
FOR %%? IN (tempfile.txt) DO ( SET /A strlength=%%~z? - 2 )

La longueur de la chaîne est maintenant dans une variable nommée strlength.

Dans un peu plus de détail:

  • FOR %%? IN (filename) DO ( ... : obtient des informations sur un fichier
  • SET /A [variable]=[expression] : évaluer l'expression numérique
  • %%~z? : Expression particulière pour obtenir la longueur du fichier

Pour écraser l'ensemble de la commande en une seule ligne:

ECHO %strvar%>x&FOR %%? IN (x) DO SET /A strlength=%%~z? - 2&del x

24voto

dbenham Points 46458

Je préfère de jeb a accepté de répondre - c'est le plus rapide de la solution et celle que j'utilise dans mes propres scripts. (En fait il y a quelques optimisations supplémentaires circulé sur DosTips, mais je ne pense pas qu'ils en valent la peine)

Mais il est amusant à venir avec de nouveaux algorithmes efficaces. Voici un nouvel algorithme qui utilise la FINDSTR /O option:

@echo off
setlocal
set "test=Hello world!"

:: Echo the length of TEST
call :strLen test

:: Store the length of TEST in LEN
call :strLen test len
echo len=%len%
exit /b

:strLen  strVar  [rtnVar]
setlocal disableDelayedExpansion
set len=0
if defined %~1 for /f "delims=:" %%N in (
  '"(cmd /v:on /c echo(!%~1!&echo()|findstr /o ^^"'
) do set /a "len=%%N-3"
endlocal & if "%~2" neq "" (set %~2=%len%) else echo %len%
exit /b

Le code soustrait 3 car le parseur jongle entre la commande et ajoute un espace avant CMD /V /C exécute. Elle peut être évitée en utilisant (echo(!%~1!^^^).

9voto

user2529742 Points 31

Les premières lignes servent simplement à démontrer la fonction: strLen.

 @echo off
set "strToMeasure=This is a string"
call :strLen strToMeasure strlen
echo.String is %strlen% characters long
exit /b

:strLen
setlocal enabledelayedexpansion
:strLen_Loop
  if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof
 

Bien sûr, cela n’est pas aussi efficace avec la version à "13 boucles" fournie par jeb. Mais il est plus facile à comprendre et votre ordinateur 3GHz peut passer à travers quelques milliers d’itérations en une petite fraction de seconde.

5voto

ghostdog74 Points 86060

Oui, bien sûr, il existe un moyen simple d'utiliser vbscript (ou Powershell).

 WScript.Echo Len( WScript.Arguments(0) )
 

enregistrer ceci en tant que strlen.vbs et en ligne de commande

 c:\test> cscript //nologo strlen.vbs "abcd"
 

Utilisez une boucle for pour capturer le résultat (ou utilisez entièrement vbscript pour votre tâche de script)

Il est certes préférable d'éviter de créer des solutions de contournement lourdes à l'aide de batch et il n'y a aucune excuse pour ne pas l'utiliser, car vbscript est disponible avec chaque distribution Windows (et PowerShell ultérieurement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X