2016-12-16 8 views
0

Предположим, что я пишу этот пакетный код, чтобы сделать переменнуюПолучение длины переменной в пакете

set var1=test 

Теперь как бы я получить длину этой переменной и эхо его?

+5

Возможный дубликат [Как вы получаете длину строки в пакетном файле?] (http: // stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file) –

ответ

-1

Если вы повторяете переменную в файле и затем получаете длину файла, вы можете вычесть 2 символа из-за невидимых символов.

echo %var1%> length.txt 
for %%? in (length.txt) do (set /a length=%%~z? - 2) 

Тогда ваша длина должна быть в переменной под названием «длина»

+0

У этого кода есть несколько проблем. Сначала использование '% var1%' не является хорошим. Зачем? Попробуйте код с 'set var1 = 2' или с' set 'var1 = Операторы перенаправления:и >> и | "'. Далее создание файла происходит медленнее, чем все в памяти. Результат также неверен, если текущий рабочий каталог защищен от записи для учетной записи пользователя, используя этот пакетный код, поскольку файл не может быть создан в текущем каталоге. Результат также неверен, если 'length.txt' существует в текущем каталоге, но имеет атрибут только для чтения. – Mofi

+0

Хорошо, спасибо за отзыв! – Woowing

+0

@Wowowing - вы можете использовать '% var%>' с пробелом перед '>', а затем вычесть '3' вместо' 2', чтобы избежать проблемы, вызванной @Mofi – afuna

1

Вы можете использовать этот код:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "var1=test" 
set "Length=0" 
if not defined var1 goto OutputLength 
:GetLength 
if not "!var1:~%Length%,1!" == "" (
    set /A Length+=1 
    goto GetLength 
) 
:OutputLength 
echo Length of variable var1 is: %Length% 
endlocal 
pause 

Для понимания используемых команд и как они работают, открыть окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?
4

версия Вызов функции

см 1. DosTips length of a string

@echo off 
set /p "input=Enter text: " 
call :strlen "%input%", len 
echo Length is %len% 
exit/B 

:strlen string len 
SetLocal EnableDelayedExpansion 
set "token=#%~1" & set "len=0" 
for /L %%A in (12,-1,0) do (
    set/A "len|=1<<%%A" 
    for %%B in (!len!) do if "!token:~%%B,1!"=="" set/A "len&=~1<<%%A" 
) 
EndLocal & set %~2=%len% 
exit/B 

How it works

Macro версия

Я включил версию макроса как, хотя может быть трудно понять, как это работает, действительно, оно ускоряет выполнение, поскольку оно расширяется внутри, не требуется никакого поиска функции.

см 1. Macros with parameters appended 2. How do you get the string length in a batch file?

@echo off 
SetLocal DisableDelayedExpansion 
call :setupMacros 
set /p "input=Enter text: " 
%STRLEN% len,input 
echo Length is %len% 
EndLocal 
exit/B 

:setupMacros 
set ^"LF=^ 

^" don't remove previous line  & rem line feed 
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^" & rem newline with line continuation 

:: macro definition 
:: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
:: http://www.dostips.com/forum/viewtopic.php?f=3&t=2518 

:: get string length 
set STRLEN=for %%{ in (1 2) do if %%{==2 (%\n% 
    for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n% 
    set "S=A!%%~2!"^&set "L=0"%\n% 
    for /L %%A in (12,-1,0) do (set/a "L|=1<<%%A"^&for %%B in (!L!) do if "!S:~%%B,1!"=="" set/a "L&=~1<<%%A")%\n% 
    for /F "delims=" %%} in ("!L!") do EndLocal^& set "%%1=%%~}"%\n% 
)%\n% 
) else SetLocal EnableDelayedExpansion ^& set argv=, 
exit/B 0 

Эти версии нужно всегда 13 операций цикла для обработки до 8192 длины символов строки. Вы можете уменьшить операции цикла для ускорения, но каждый цикл удаляют, сократить на две длины, которые могут быть обработаны (т.е. 12 петли = 4096, 11 петель = 2048, и так далее)

Смежные вопросы